【发布时间】:2016-04-18 03:13:55
【问题描述】:
作为一个简化的示例,我需要选择客户的送货地址不同于他们之前的送货地址的每个实例。所以我有一个大表,其中包含以下列:
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 通常要求在 ORDER BY 之前完成 GROUP BY。因此,我无法弄清楚如何适应例如this question 的最佳答案之一(否则我非常喜欢。)有必要(至少在概念上)在分组或使用像 min() 这样的聚合函数之前按日期排序,否则我会错过像第 7 行这样的实例我的示例表,其中客户“搬回”到以前的地址。
还要注意两个客户可以共享一个地址,所以我需要在按日期订购后有效地按cust_id 和address 分组。
我使用的是雪花,我相信它与最新版本的 PostgreSQL 和 SQL Server 具有大部分相同的命令(尽管我对雪花还很陌生,所以不能完全确定。)
【问题讨论】:
-
您是否只想为拥有多个地址的客户退货?
-
可能是 1,2,5,8 而不是 1,2,7,8?
-
Anthony E:不,我想(至少)为所有曾经有过地址的客户返回 1 行,为已经更改过一次或多次地址的客户返回更多行。 Giorgi Nakeuri:谢谢,应该是 1、2、5、7 和 8。(第 5 行和第 7 行的地址都与客户使用的最后一个地址不同。)已编辑。
标签: sql group-by sql-order-by snowflake-cloud-data-platform