2017-08-24 70 views
0

我有一個表包含所有電話號碼的發票,每個號碼有幾個發票,我想只顯示精確數字的第一張發票,但我真的不知道如何只獲得第一張發票,這是我的查詢獲取最短日期作爲條件

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 ) 

回答

2

使用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; 

如果你擔心聯繫,要顯示所有的聯繫,那麼你就可以無論RANKDENSE_RANK更換ROW_NUMBER

+0

感謝您的信息,它的工作 –

+0

我只是改變順序由ASC –

1

如果我正確理解,再一個方法是使用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 
3

Teradata的支持QUALIFY子句來過濾OLAP-函數的結果(類似於HAVINGGROUP BY之後),從而大大簡化添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