获取最小日期作为条件

Get Min date as condition

我有一个 table 包含所有 phone 号码的发票,每个号码都有几张发票,我想只显示第一张发票以获得准确的号码,但我真的不知道如何只获得第一张发票,这是我的查询

SELECT
     b.contrno
     a.AR_INVDATE
     FROM P_STG_TABS.IVM_INVOICE_RECORD a 

     INNER JOIN P_EDW_TMP.invoice b
     ON b.contrno=a.contrno

     WHERE a.AR_INVDATE< (SELECT AR_INVDATE FROM P_STG_TABS.IVM_INVOICE_RECORD WHERE contrno=b.contrno  )

使用ROW_NUMBER():

SELECT
    t.contrno,
    t.AR_INVDATE
FROM
(
    SELECT
        b.contrno,
        a.AR_INVDATE,
        ROW_NUMBER() OVER (PARTITION BY b.contrno ORDER BY a.AR_INVDATE) rn
    FROM P_STG_TABS.IVM_INVOICE_RECORD a 
    INNER JOIN P_EDW_TMP.invoice b
        ON b.contrno = a.contrno
) t
WHERE t.rn = 1;

如果您担心平局,并且想要显示所有平局,那么您可以将 ROW_NUMBER 替换为 RANKDENSE_RANK

如果我理解正确,那么一种方法是使用 group bymin(a.AR_INVDATE):

SELECT
b.contrno,
min(a.AR_INVDATE)
FROM P_STG_TABS.IVM_INVOICE_RECORD a 
INNER JOIN P_EDW_TMP.invoice b
ON b.contrno=a.contrno
group by b.contrno

Teradata 支持 QUALIFY 子句过滤 OLAP 函数的结果(类似于 GROUP BY 之后的 HAVING),这大大简化了 Tim Biegeleisens 的回答:

SELECT *
FROM P_STG_TABS.IVM_INVOICE_RECORD a 
INNER JOIN P_EDW_TMP.invoice b
   ON b.contrno = a.contrno
QUALIFY
   ROW_NUMBER()
   OVER (PARTITION BY b.contrno 
         ORDER BY a.AR_INVDATE)  = 1

此外,您可以在加入之前应用 ROW_NUMBER(根据其他条件可能更有效):

SELECT *
FROM 
 ( SELECT * 
   FROM P_STG_TABS.IVM_INVOICE_RECORD a 
   QUALIFY
      ROW_NUMBER()
      OVER (PARTITION BY b.contrno 
            ORDER BY a.AR_INVDATE)  = 1
 ) AS a
INNER JOIN P_EDW_TMP.invoice b
   ON b.contrno = a.contrno