需要帮助以在 DB2 中进行正确的选择查询
Posted
技术标签:
【中文标题】需要帮助以在 DB2 中进行正确的选择查询【英文标题】:Need help to make correct select query in DB2 【发布时间】:2016-12-03 01:18:54 【问题描述】:我还没有在大学完成相关课程,所以我不能确定这个查询是否正确,它有效但它看起来太奇怪了,所以我需要审查和一些反馈。
我有以下带有混合主键的 IP_TABLE
表:ID
+ IP
----------------------------------
| ID | DATE | IP |
----------------------------------
| 1 | 2016-10-01| 1.2.3.10 |
----------------------------------
| 2 | 2016-10-20| 1.2.3.20 |
----------------------------------
| 2 | 2016-10-25| 1.2.3.40 |
----------------------------------
| 3 | 2016-10-01| 1.2.3.10 |
----------------------------------
| 3 | 2016-10-25| 1.2.3.25 |
----------------------------------
我想获取相同 id 中数据具有最大值的所有行,如下所示:
----------------------------------
| ID | DATE | IP |
----------------------------------
| 1 | 2016-10-01| 1.2.3.10 |
----------------------------------
| 2 | 2016-10-25| 1.2.3.40 |
----------------------------------
| 3 | 2016-10-25| 1.2.3.25 |
----------------------------------
现在我有两个查询可以完成这项工作:
SELECT * FROM (SELECT ID, MAX(DATE) AS LAST_DATE
FROM IP_TABLE
GROUP BY ID
ORDER BY MAX(DATE) ASC) AS T1
LEFT JOIN IP_TABLE AS T2
ON T1.ID = T2.ID
AND T1.LAST_DATE = T2.DATE
我将表连接到自身看起来很奇怪,不知道它是否正确。
第二个工作查询如下:
SELECT * FROM IP_TABLE AS T1
WHERE DATE = (SELECT MAX(DATE) FROM IP_TABLE WHERE ID = T1.ID)
它担心这个查询会导致性能影响,因为它看起来像 O(n^2),即对于每一行,它都会查看所有行。
【问题讨论】:
【参考方案1】:你可以使用像ROW_NUMBER
这样的窗口函数:
SELECT ID, DATE, IP
FROM (
SELECT ID, DATE, IP,
ROW_NUMBER() OVER (PARTITION BY ID
ORDER BY DATE DESC) AS rn
FROM IP_TABLE) AS t
WHERE t.rn = 1
ROW_NUMBER
枚举每个ID
切片中的记录,从具有最新DATE
值的记录开始(由于ORDER BY DATE DESC
子句)。因此,外部查询选择 latest-per-ID
记录。
【讨论】:
谢谢它的工作原理,但你能解释一下它是如何工作的吗?以上是关于需要帮助以在 DB2 中进行正确的选择查询的主要内容,如果未能解决你的问题,请参考以下文章
DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果
需要帮助优化涉及数百万条记录的非常慢的 DB2 SQL 查询