作为一个简化的示例,我需要选择客户的送货地址与他们之前的送货地址不同的每个实例。所以我有一个大表,其中包含以下列:
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
。因此,我无法弄清楚如何调整这个问题的任何一个最佳答案(否则我非常喜欢。)有必要(至少在概念上)在分组或使用聚合函数之前按日期排序min()
,否则我会错过像我的示例表中的第 7 行这样的实例,其中客户“移回”到以前的地址。
另请注意,两个客户可以共享一个地址,因此我需要在按日期订购后cust_id
按两者有效分组。address
我正在使用雪花,我相信它与最新版本的 PostgreSQL 和 SQL Server 具有大部分相同的命令(尽管我对雪花还很陌生,所以不完全确定。)