我确信这已经被反复询问,但我找不到一个我可以完全理解的简单示例。
我正在尝试对DISTINCT ON
一列进行重复数据删除(执行 a )并COUNT
记录GROUPed By
与用于重复数据删除的列不同的列,但不引入子查询。
假设我有一张包含以下信息的表格:
订单号 | 日期 | 地区 | 时间戳更新 |
---|---|---|---|
001 | 2021-09-01 | 穆里卡 | 2021-09- 02 T19:00:01Z |
001 | 2021-09-01 | 穆里卡 | 2021-09- 03 T19:00:01Z |
002 | 2021-09-01 | 尤罗普 | 2021-09-02T19:00:01Z |
003 | 2021-09-01 | 尤罗普 | 2021-09-03T19:00:01Z |
004 | 2021-09-02 | 尤罗普 | 2021-09-03T19:00:01Z |
我想首先获得具有不同order_num
(保持最近更新)的唯一记录,date
然后按and计算组或订单region
。
去重(去掉最旧的
order_num='001A'
):订单号 日期 地区 时间戳更新 001 2021-09-01 穆里卡 2021-09- 03 T19:00:01Z 002 2021-09-01 尤罗普 2021-09-02T19:00:01Z 003 2021-09-01 尤罗普 2021-09-03T19:00:01Z 004 2021-09-02 尤罗普 2021-09-03T19:00:01Z 然后分组并计数:
日期 地区 数数 2021-09-01 穆里卡 1 2021-09-01 尤罗普 2 2021-09-02 尤罗普 1
我知道如何分别做这两件事(distinct on(order_num)
+ order by timestamp_updated desc
)来重复数据删除,然后select count(*)
+ group by date, region
)甚至与子查询一起做。但我想尽量避免子查询,这就是窗口函数(似乎)派上用场的地方,我对此一无所知。
我能得到的最接近的东西是组,但它们每个都显示一个记录order_num
。记录是正确的,但它们是重复的:
select distinct on (order_num) date, region, count(1)over (
partition by order_num
)
from orders_table
order by order_num, timestamp_updated desc;
该查询 ^^ 显示:
日期 | 地区 | 数数 | |
---|---|---|---|
2021-09-01 | 穆里卡 | 1 | 我认为这是第一个001 |
2021-09-01 | 穆里卡 | 1 | 我想这是第二个001 |
2021-09-01 | 尤罗普 | 2 | 我认为这是第一个 Yurop:002 |
2021-09-01 | 尤罗普 | 2 | 我认为这是第二个 Yurop:003 |
2021-09-02 | 尤罗普 | 1 |