【问题标题】:Need help to make correct select query in DB2需要帮助以在 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),即对于每一行,它都会查看所有行。

【问题讨论】:

    标签: sql select db2 left-join greatest-n-per-group


    【解决方案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 记录。

    【讨论】:

    • 谢谢它的工作原理,但你能解释一下它是如何工作的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2019-04-04
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多