gpt4 book ai didi

SQL:按顺序排序,然后为多列选择具有不同值的第一行

转载 作者:行者123 更新时间:2023-12-04 14:29:52 25 4
gpt4 key购买 nike

作为一个简化的示例,我需要选择客户的送货地址与其之前的送货地址不同的每个实例。所以我有一个大表,其中包含以下列:

purchase_id | cust_id | date | address  | description
-----------------------------------------------------------
1 | 5 | jan | address1 | desc1
2 | 6 | jan | address2 | desc2
3 | 5 | feb | address1 | desc3
4 | 6 | feb | address2 | desc4
5 | 5 | mar | address3 | desc5
6 | 5 | mar | address3 | desc6
7 | 5 | apr | address1 | desc7
8 | 6 | may | address4 | desc8

请注意,客户可以像客户 5 在第 7 行那样“移回”到之前的地址。

我想要选择(并且尽可能高效,因为这是一个非常大的表格)是每个“块”中的第一行,其中客户将后续订单运送到同一地址。在此示例中,该行将是第 1、2、5、7 和 8 行。在所有其他行中,客户的地址与他们之前的订单相同。

如此有效,我想先 ORDER BY (cust_id, date) ,然后 SELECT purchase_id, cust_id, min(date), address, description .

但是我遇到了麻烦,因为 SQL 通常需要 GROUP BY之前要做的 ORDER BY .因此,我无法弄清楚如何适应,例如 this question 的最佳答案之一(否则我非常喜欢。)在分组或使用聚合函数(如 min())之前,有必要(至少在概念上)按日期排序。 ,否则我会错过示例表中第 7 行这样的实例,其中客户“移回”到了以前的地址。

另请注意,两个客户可以共享一个地址,因此我需要按 cust_id 进行有效分组。和 address按日期订购后。

我正在使用雪花,我相信它与最新版本的 PostgreSQL 和 SQL Server 具有大部分相同的命令(尽管我对雪花相当陌生,所以不能完全确定。)

最佳答案

您可以使用 row_number窗口函数来做的伎俩:

;with cte as(select *, row_number() over(partition by cust_id, address
order by purchase_id) as rn from table)
select * from cte
where rn = 1

关于SQL:按顺序排序,然后为多列选择具有不同值的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com