使用 DB2 SQL,对于不属于我的 where 子句的条件,如何避免返回不是最新的行?

Posted

技术标签:

【中文标题】使用 DB2 SQL,对于不属于我的 where 子句的条件,如何避免返回不是最新的行?【英文标题】:Using DB2 SQL, how can I avoid returning rows that aren't the most recent, for a condition that is NOT part of my where clause? 【发布时间】:2019-01-18 20:29:04 【问题描述】:

场景数据:

Row   Col1    Col2    Col3         Col4    Col5
1     Bob     Smith   2000-01-01   John    Doe
2     Bob     Smith   2010-01-01   Jane    Jones
3     Ted     Jones   2005-01-01   Pete    Mills
4     Ted     Jones   2008-01-01   John    Doe

我的 SQL:

select col1, col2 from schema.table where col4='John' and col5='Doe'

我不知道如何根据以下需要限制我的数据。

我正在搜索 John Doe 在第 4/5 列中的位置,但如果它是第 1/2 列中的人的当前关系(基于第 3 列),我只想检索该行。

在上述数据中,我确实想要第 4 行,因为 John Doe 目前与 Ted Jones 有关。但我不想检索第一行...因为 John Doe 行不是 Bob Smith 的当前关系。 Bob Smith 目前的关系是 Jane Jones。

如果我正在寻找 Pete Mills,我不会想找到任何东西,因为 Pete Mills 不是 Ted Jones 当前的关系。

【问题讨论】:

呃。抱歉...示例数据场景未正确发布。当我进入它时看起来很好。也许粘贴到文本编辑器? 我为你解决了这个问题。将来,如果您想为 Stack Overflow 上的任何文本添加代码格式,只需突出显示这些行,然后单击文本编辑器中的 图标。 Select first row in each GROUP BY group?的可能重复 e_i_pi (e-i-e-i-o 大声笑),发条....非常感谢。发条,我找不到现有答案的问题主要是我不知道如何正确表达我的问题。感谢您的耐心。祝大家新年快乐。 @Rich - 没关系;这就是 为什么 “关闭为重复”存在的原因。它说“是的,有一个答案,规范版本在这里”。因此,下一个以与您相同的方式表达问题的人会指向更“正确”的版本。但是,如果该答案不能让您解决问题,那么您需要添加说明为什么它不适合的原因。 【参考方案1】:

您需要使用 DB2 调用 OLAP functions 的东西(其他 RDMS 引擎倾向于将它们称为窗口函数——这两个术语都有效)。 OLAP 函数允许您返回有关行的分析数据,例如它在排序列表中是什么数字。

对于您的查询,您只想返回每个人的第一行,因此我们使用名为 ROW_NUMBER() 的 OLAP 函数。当我们使用这个函数时,我们想要对 Col1/Col2 数据进行分区(即我们正在对该数据进行分组),然后对 Col3 进行反向排序以获得最新结果。之后,我们要在 OLAP 函数中选择具有最高值的行,如下所示:

SELECT *
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY Col3 DESC) AS rn
    FROM schema.table
) AS ranked_scenarios
WHERE rn = 1

【讨论】:

以上是关于使用 DB2 SQL,对于不属于我的 where 子句的条件,如何避免返回不是最新的行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL / DB2 数组在 Where 中声明

我们应该在检索数据时避免 DB2 SQL 中的 IN 子句吗?

将日期转换放在where子句db2 sql中

DB2 SQL:如何将“WHERE EXISTS”表中的列添加到选择语句

SQL DB2 条件选择

HSQLDB Junit 测试对 DB2 和 SQL Server NOLOCK 查询失败