我有一张桌子,

id |date                   |browser
---+———————————————————————+——————————————————————-
101|2024-03-12 00:00:00.000|Chrome |
102|2024-03-12 00:00:00.000|Firefox|
103|2024-03-13 00:00:00.000|Chrome |
104|2024-03-13 00:00:00.000|Firefox|
105|2024-03-13 00:00:00.000|Brave  |
106|2024-03-14 00:00:00.000|Chrome |
107|2024-03-14 00:00:00.000|Firefox|
108|2024-03-14 00:00:00.000|Edge   |

我想计算发生次数,并将发生次数插入另一个数据库,如下所示(插入jsonb列).浏览器只是一个字符串的例子,可以有许多不同类型的值(即它不是枚举类型,所以值是未知的).

id |date                   |json_count
---+———————————————————————+———————————————————————————————————————-
101|2024-03-12 00:00:00.000|{“Chrome”: 1, “Firefox”: 1}            |
102|2024-03-13 00:00:00.000|{“Chrome”: 1, “Firefox”: 1, “Brave”: 1}|
103|2024-03-14 00:00:00.000|{“Chrome”: 1, “Firefox”: 1, “Edge”: 1} |

如何在SQL查询中实现这一点?

推荐答案

我们需要使用GROUP BYCOUNT()按日期和浏览器计算出现次数,然后使用jsonb_object_agg()将jsonb_Object_agg应用于聚合Browser/Count对作为JSON对象:

select min(id) as id, date, json_object_agg(browser, cnt) as json_count
from (
  select date, browser, min(id) as id, count(*) as cnt
  from mytable
  group by date, browser
)
group by date;

结果:

id  date                json_count
101 2024-03-12 00:00:00 {"Chrome": 1, "Firefox": 1}
106 2024-03-14 00:00:00 {"Edge": 1, "Chrome": 1, "Firefox": 1}
103 2024-03-13 00:00:00 {"Brave": 1, "Chrome": 1, "Firefox": 1}

Demo here

Sql相关问答推荐

Postgresql -如何计算刷卡和刷卡时间

SQL—如何在搜索的元素之后和之前获取元素?

LAG函数通过丢弃空值返回前一行

使用sede获取不一定有两个不同标签的所有问题

SQL -滞后于上一个非重复值

删除事务中的本地临时表

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

IF NOT EXISTS子查询的性能瓶颈

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

SQL按组 Select 最小值,当值不存在时为Null

在特定条件下使用 LAG,确定要采用什么 LAG 值?

将最近的结束日期与开始日期相匹配

多行状态下的分组查询判断状态

使用in和and运算符过滤记录的条件

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

面对来自以下两个代码的不同输出

在 MySql 数据库中的两个日期之间搜索

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?