使用分区编写此 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

您需要为较大的查询整理出特定条件,但这实际上是 JOINing 所有行 (T1),但随后排除存在后面行的任何行。在 WHERE 子句中,您通过检查 NOT NULL 列中的 NULL 值来消除这些(在这种情况下,我只是假定了一些 ID 值)。发生这种情况的唯一方法是如果 T2 上的 LEFT OUTER JOIN 找不到匹配项 - 即没有比您想要的行晚的行存在。

另外,T1的JOINLEFT 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;