获取最小日期作为条件
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
替换为 RANK
或 DENSE_RANK
。
如果我理解正确,那么一种方法是使用 group by
和 min(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
我有一个 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
替换为 RANK
或 DENSE_RANK
。
如果我理解正确,那么一种方法是使用 group by
和 min(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