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

标签 sql db2

场景数据:

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 列)。

在上面的数据中,我确实想要第四行,因为 John Doe 目前与 Ted Jones 有关系。但我不想检索第一行...因为 John Doe 行不是 Bob Smith 的当前关系。鲍勃·史密斯 (Bob Smith) 目前的关系是简·琼斯 (Jane Jones)。

如果我正在搜索 Pete Mills,我不会想找到任何内容,因为 Pete Mills 不是 Ted Jones 目前的关系。

最佳答案

您需要使用 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

关于sql - 使用 DB2 SQL,对于不属于 where 子句的条件,如何避免返回不是最新的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261001/

相关文章:

sql - Windows SQL 数据库行顺序?

sql - 在 Cursor 中的情况

java - 表关系 多对多没有 sql 中的中间表?

unicode - DB2 VARCHAR unicode 数据存储

database - DB2 操作超时或死锁

stored-procedures - 如何使用来自 SQuirreL SQL 的 OUT 参数调用 DB2 存储过程?

sql - 选择最佳日期

sql - DB2 LIKE 匹配模式

sql - 具有 NaN 值的 Postgres 排序列

sql - 使用 Powershell 创建 SQL Server 用户