2017-08-24 69 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