使用 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 子句的条件,如何避免返回不是最新的行?的主要内容,如果未能解决你的问题,请参考以下文章
我们应该在检索数据时避免 DB2 SQL 中的 IN 子句吗?