样品内容物为:
| 身份证|创建日期|资料|
| - ------|- ------|- ------|
| 1个|2023年1月14日11时52分41秒|{"客户":1、"收支情况:2)|
| 第二章|2023年1月15日11时53分43秒|{"客户":1、"收支情况:2)|
| 三个|2023年1月18日11时51分45秒|{"客户":1、"收支情况:2)|
| 四个|2023年1月15日11时50分48秒|{"客户":1、"收支情况:2)|
ID 4或2应不同。
我希望得到如下结果:
| 年份|星期|客户|付款|
| - ------|- ------|- ------|- ------|
| 二○二三|第二章|第二章|四个|
| 二○二三|三个|1个|第二章|
我用这种方法解决了这个问题
SELECT
date_part('year', sq.created_dt) AS year,
date_part('week', sq.created_dt) AS week,
sum((sq.data->'customers')::int) AS customers,
sum((sq.data->'payments')::int) AS payments
FROM
(SELECT DISTINCT ON (created_dt::date) created_dt, data
FROM analytics) sq
GROUP BY
year, week
ORDER BY
year, week;
然而,这个子查询会使查询变得非常复杂,有没有更好的方法?
我需要按每周对数据进行分组,但我还需要删除重复的日期。
3条答案
按热度按时间vyswwuz21#
生成系列以创建连接表将解决以下问题:
0mkxixxg2#
首先,我认为你的查询相当简单易懂。
以下是包含
with
-query的查询,在某些方面它增加了更多可读性:区别在于第一个查询使用
DISTINCT
子句,而不是DISTINCT ON
子句。这是sql fiddle。
3z6pesqy3#
您可以通过在"* created_id::date *"上添加分区来简化它,然后使用
FETCH FIRST n ROWS WITH TIES
过滤每周的最后一个聚合记录。检查here演示。