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 值:
- 如果值重复,则 select Col3 中的最新日期
- 如果(且仅当)它仍然是重复的,那么 select col2=1 的行
- 如果仍然重复,则 select col4 中的最新日期。
考虑到前面的 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
否则,这与上面的答案相同。
我必须从另一个来源填充 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 值:
- 如果值重复,则 select Col3 中的最新日期
- 如果(且仅当)它仍然是重复的,那么 select col2=1 的行
- 如果仍然重复,则 select col4 中的最新日期。
考虑到前面的 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
否则,这与上面的答案相同。