1

我确信这已经被反复询问,但我找不到一个我可以完全理解的简单示例。

我正在尝试对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
4

1 回答 1

1

你可以得到最大值,然后再次聚合以获得每次timestamp_updated使用的计数order_num, date, regiondate, regionwindow function

select distinct 
       date, 
       region, 
       count(max(timestamp_updated)) over (partition by date, region) as counts 
from t
group by order_num, date, region;

演示

于 2021-09-27T15:28:47.247 回答