SQL分区上的多个“级别”条件

Posted

技术标签:

【中文标题】SQL分区上的多个“级别”条件【英文标题】:Muliple "level" conditions on partition by SQL 【发布时间】:2020-07-05 21:17:42 【问题描述】:

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

+------+------+------------+------------+
| 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 在源代码中重复,因此我们有规则来选择正确的行(col1 在最终结果中是唯一的) 对于 col1 中的 if 值:

如果值重复,则在 Col3 中选择最近的日期 如果(且仅当)它仍然重复,则选择 col2=1 的行 如果仍然重复,则在 col4 中选择最近的日期。

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

+------+------+------------+------------+
| 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 |
+------+------+------------+------------+

我开始使用 partition by 对 col 3 中出现的每个值进行分组,但我不知道如何在 sql 查询中为每个分区应用条件

感谢您的帮助

【问题讨论】:

您的第三个条件与第一个条件位于同一列。我认为应该是col4 @GordonLinoff 完全正确,我已经更正了这个问题。 【参考方案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

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

【讨论】:

【参考方案2】:

你可以使用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;

【讨论】:

非常感谢@Gordon,我刚刚测试过,它可以工作。

以上是关于SQL分区上的多个“级别”条件的主要内容,如果未能解决你的问题,请参考以下文章

R:根据OR条件创建具有多个级别的新变量[重复]

递归sql级别1出现错误

隔离级别不保证 ORACLE Sql 上的事务存在

多个级别的 SQL Datediff [关闭]

在MS SQL上的更新查询中减少PAGE级别的死锁

在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?