使用分区编写此 SQL 查询的不同方式
Different way of writing this SQL query with partition
您好,我在 Teradata 中有以下查询。我有一个行号分区,我想要 rn=1 的行。 Teradata 不允许我在同一个查询中使用行号作为过滤器。我知道我可以将下面的内容放入带有 where rn=1
的子查询中,它可以满足我的需要。但是下面的代码片段需要进入更大的查询,我想尽可能简化它。
是否有不同的方法,所以我得到一个有 2 列的 table - 每个客户一行,最新的 eff_to_dt 对应 fc_id?
select cust_grp_id, fc_id, row_number() over (partition by cust_grp_id order by eff_to_dt desc) as rn
from table1
为每个 cust_grp_id
计算 MAX
eff_to_dt
,然后将结果加入主 table.
SELECT T1.cust_grp_id,
T1.fc_id,
T1.eff_to_dt
FROM Table1 AS T1
JOIN
(SELECT cust_grp_id,
MAX(eff_to_dt) AS max_eff_to_dt
FROM Table
GROUP BY cust_grp_id) AS T2 ON T2.cust_grp_id = T1.cust_grp_id
AND T2.max_eff_to_dt = T1.eff_to_dt
您可以使用一对 JOIN
来完成同样的事情:
INNER JOIN My_Table T1 ON <some criteria>
LEFT OUTER JOIN My_Table T2 ON <some criteria> AND T2.eff_to_date > T1.eff_to_date
WHERE
T2.my_id IS NULL
您需要为较大的查询整理出特定条件,但这实际上是 JOIN
ing 所有行 (T1),但随后排除存在后面行的任何行。在 WHERE
子句中,您通过检查 NOT NULL
列中的 NULL 值来消除这些(在这种情况下,我只是假定了一些 ID 值)。发生这种情况的唯一方法是如果 T2 上的 LEFT OUTER JOIN
找不到匹配项 - 即没有比您想要的行晚的行存在。
另外,T1的JOIN
是LEFT OUTER
还是INNER
看你的具体要求了。
您是否考虑过在查询中使用 QUALIFY 子句?
SELECT cust_grp_id
, fc_id
FROM table1
QUALIFY ROW_NUMBER()
OVER (PARTITION BY cust_grp_id
ORDER BY eff_to_dt desc)
= 1;
您好,我在 Teradata 中有以下查询。我有一个行号分区,我想要 rn=1 的行。 Teradata 不允许我在同一个查询中使用行号作为过滤器。我知道我可以将下面的内容放入带有 where rn=1
的子查询中,它可以满足我的需要。但是下面的代码片段需要进入更大的查询,我想尽可能简化它。
是否有不同的方法,所以我得到一个有 2 列的 table - 每个客户一行,最新的 eff_to_dt 对应 fc_id?
select cust_grp_id, fc_id, row_number() over (partition by cust_grp_id order by eff_to_dt desc) as rn
from table1
为每个 cust_grp_id
计算 MAX
eff_to_dt
,然后将结果加入主 table.
SELECT T1.cust_grp_id,
T1.fc_id,
T1.eff_to_dt
FROM Table1 AS T1
JOIN
(SELECT cust_grp_id,
MAX(eff_to_dt) AS max_eff_to_dt
FROM Table
GROUP BY cust_grp_id) AS T2 ON T2.cust_grp_id = T1.cust_grp_id
AND T2.max_eff_to_dt = T1.eff_to_dt
您可以使用一对 JOIN
来完成同样的事情:
INNER JOIN My_Table T1 ON <some criteria>
LEFT OUTER JOIN My_Table T2 ON <some criteria> AND T2.eff_to_date > T1.eff_to_date
WHERE
T2.my_id IS NULL
您需要为较大的查询整理出特定条件,但这实际上是 JOIN
ing 所有行 (T1),但随后排除存在后面行的任何行。在 WHERE
子句中,您通过检查 NOT NULL
列中的 NULL 值来消除这些(在这种情况下,我只是假定了一些 ID 值)。发生这种情况的唯一方法是如果 T2 上的 LEFT OUTER JOIN
找不到匹配项 - 即没有比您想要的行晚的行存在。
另外,T1的JOIN
是LEFT OUTER
还是INNER
看你的具体要求了。
您是否考虑过在查询中使用 QUALIFY 子句?
SELECT cust_grp_id
, fc_id
FROM table1
QUALIFY ROW_NUMBER()
OVER (PARTITION BY cust_grp_id
ORDER BY eff_to_dt desc)
= 1;