【问题标题】:Get any value from a column aggregated by other column and where the max date is selected从由其他列聚合并选择最大日期的列中获取任何值
【发布时间】:2017-11-27 09:30:25
【问题描述】:

我是 SQL 新手,我有一个包含以下列的表

+-------+--------+----+----+
| email |  date  | IP | ID |
+-------+--------+----+----+

我想做这样的事情:

SELECT T.email,
       Max(T.date),
       T.ip     AS User_IP,
       T.id     AS ID

FROM LoginTable as T

WHERE (IP IS NOT NULL)

GROUP BY T.email

这当然行不通,因为 IP 和 ID 不在(最大)聚合函数中。但我需要 IP 与 ID 和日期匹配,所以我不能在这些列中使用 (max),因为我会从不同的行中得到结果,这不是一个选项。

回顾一下,我需要:

  • 每封唯一电子邮件有一行(因此是分组依据)
  • 所选行是日期最近的行 -> max(date)
  • 我需要 IP 和 ID 与 max(date) 选择的行位于同一行。

【问题讨论】:

  • @WhatsThePoint 每封电子邮件将返回不止一行,因为所有 ID 都是唯一的,而且单个用户电子邮件的 IP 也可能不相等。 Mureinik 和 jophab 的回复就像一个魅力。谢谢!

标签: sql sql-server select top-n


【解决方案1】:

救援窗口函数:

SELECT email, date, user_ip, id
FROM   (SELECT email, date, ip AS user_ip, logid AS id, 
               ROW_NUMBER() OVER (PARTITION BY email ORDER BY date DESC) AS rn
        FROM   mytable
        WHERE  ip IS NOT NULL) t
WHERE  rn = 1

注意:此查询将准确检索每封唯一电子邮件的一行。如果你想支持与最大日期绑定的记录,你应该使用rank() 而不是row_number()

【讨论】:

    【解决方案2】:

    您可以使用 sql server 中可用的Ranking Functions 代替GROUP BY

    一个例子是ROW_NUMBER()

    ;WITH CTE AS (
     SELECT  ROW_NUMBER () OVER (PARTITION BY email ORDER BY DATE DESC) AS rn,
             email, 
             date,
             ip        AS User_IP,
             Logid     AS ID        
     FROM Table T WHERE (IP IS NOT NULL)
    )
    SELECT * FROM CTE WHERE RN=1
    

    【讨论】:

    【解决方案3】:

    如果您在 Table(email, date) 上有索引,这将非常有用

    SELECT email  AS email,
      date        AS Date,
      ip          AS User_IP,
      Logid       AS ID
    FROM Table
    WHERE IP IS NOT NULL and 
          (email, date) = (
               SELECT email, Max(date) 
               FROM Table 
               GROUP BY email
           )
    

    【讨论】:

      【解决方案4】:

      试试这个答案,

      SELECT L.email  AS email,
      L.date      AS Date,
      L.ip        AS User_IP,
      L.Logid     AS ID
      FROM Table AS T
      WHERE EXISTS(
          SELECT email,MAX(Date)Date 
          FROM Table 
          GROUP BY email) AND (IP IS NOT NULL)
      GROUP BY T.email
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2021-07-11
        • 1970-01-01
        相关资源
        最近更新 更多