[英]Count unique rows GROUP(ed) BY different columns than used in DISTINCT ON
我确信这个问题已经被反复询问过,但我找不到一个我可以完全理解的简单例子。
我正在尝试按一列进行重复数据删除(执行DISTINCT ON
),并按与用于重复数据删除的列不同但不引入子查询的列对COUNT
记录GROUPed By
。
假设我有一张包含以下信息的表格:
order_num | 日期 | 地区 | 时间戳_更新 |
---|---|---|---|
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
和region
对组或订单进行计数。
重复数据删除(删除最旧的order_num='001A'
):
order_num | 日期 | 地区 | 时间戳_更新 |
---|---|---|---|
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
)甚至连同子查询。 但我想尽量避免子查询,这里是 window 函数(似乎)派上用场的地方,我对这些了解
不多
。
我能得到的最接近的是组,但它们按每个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个 |
您可以获得每个order_num, date, region
的最大timestamp_updated
,然后再次聚合以获取每个date, region
的计数,使用window function
select distinct
date,
region,
count(max(timestamp_updated)) over (partition by date, region) as counts
from t
group by order_num, date, region;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.