SQL 分区的多个 "level" 条件

Muliple "level" conditions on partition by SQL

我必须从另一个来源填充 teradata table,这样可以简化为:

+------+------+------------+------------+
| Col1 | Col2 |    Col3    |    Col4    |
+------+------+------------+------------+
| 1234 |    0 | 01/01/2009 | 01/04/2019 |
| 1234 |    3 | 01/01/2010 | 01/05/2020 |
| 2345 |    1 | 20/02/2013 | 01/04/2019 |
| 2345 |    0 | 20/02/2013 | 01/04/2018 |
| 2345 |    2 | 31/01/2009 | 01/04/2017 |
| 3456 |    0 | 01/01/2009 | 01/04/2019 |
| 3456 |    1 | 01/01/2015 | 01/04/2019 |
| 3456 |    1 | 01/01/2015 | 01/05/2017 |
| 3456 |    3 | 01/01/2015 | 01/04/2019 |
+------+------+------------+------------+

Col1 在源代码中是重复的,所以我们有 select 右行的规则(col1 在最终结果中是唯一的) 对于 col1 中的 if 值:

考虑到前面的 table 我们应该得到以下结果:

+------+------+------------+------------+
| Col1 | Col2 |    Col3    |    Col4    |
+------+------+------------+------------+
| 1234 |    3 | 01/01/2010 | 01/05/2020 |
| 2345 |    1 | 20/02/2013 | 01/04/2019 |
| 3456 |    1 | 01/01/2015 | 01/04/2019 |
+------+------+------------+------------+

我开始使用分区依据对列 3 中出现的每个值进行分组,但我不知道如何在 sql 查询

中为每个分区应用条件

感谢您的帮助

您可以使用 row_number():

select t.*
from (select t.*,
             row_number() over (partition by col1
                                order by col3 desc,
                                         (case when col2 = 1 then 1 else 2 end),
                                         col4 desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

您可以在 Teradata 中使用 QUALIFY 来简化语法:

SELECT col1, col2, col3, col4
FROM mytable
QUALIFY ROW_NUMBER() OVER(
  PARTITION BY col1 -- Group rows by "col1" values
  ORDER BY col3 DESC, CASE WHEN col2 = 1 THEN 1 ELSE 2 END, col4 DESC -- Order rows
) = 1 -- Get "first" row in each group

否则,这与上面的答案相同。