Teradata SQL 按项目获取最近的单个客户

Teradata SQL Get Most Recent Single Customer By Item

我正在努力按项目获取最近的单个客户。我有一个 table 的销售信息如下

ITEM   INVOICE_DT  CUST_NM  SALES_AMT
ITEM1  1/5/2022    CUST1    100
ITEM1  1/5/2022    CUST2    200
ITEM1  1/1/2022    CUST3    300
ITEM2  1/3/2022    CUST1    50
ITEM2  1/3/2022    CUST2    50
ITEM2  1/1/2022    CUST3    100

我尝试了以下方法:

SELECT A.ITEM, A.INVOICE_DT, A.CUST_NM
FROM SALES_TABLE A
INNER JOIN (SELECT ITEM, MAX(INVOICE_DT) AS MAX_INVOICE_DT FROM SALES_TABLE GROUP BY ITEM) B
ON A.ITEM = B.ITEM AND A.INVOICE_DT = B.MAX_INVOICE_DT

我 运行 遇到的问题是,如果多个客户在同一天购买了同一件商品,则同一件商品的输出会重复。我正在考虑使用销售额作为决胜局,但我不知道如何实施。同样在极少数情况下,两个客户在同一天以相同的总销售额购买相同的商品,我宁愿选择一个 'random' 单一的客户名称,也不愿选择比零件数量更多的记录。

预期输出:

ITEM   INVOICE_DT  CUST_NM
ITEM1  1/5/2022    CUST2
ITEM2  1/3/2022    CUST1 OR CUST2

您可以使用 Ordered Analytical Function 来处理这种情况。

借助有序分析函数,您可以 RANK 您的客户基于 INVOICE_DT 和 SALES_AMT。

您可以如下重写您的查询以获得结果。

SELECT  a.item,
         a.invoice_dt,
         a.cust_nm ,
         ROW_NUMBER() OVER(PARTITION BY a.item ORDER BY a.invoice_dt DESC,a.sales_amt DESC) AS rn
FROM sales_table a
 QUALIFY rn=1

注意:如果两个客户在同一天购买了相同数量的相同商品,结果将是随机的,您也可以添加order by cust_nm以获得相同的结果每次都有结果。