从其他列聚合的列中获取任何值,并选择最大日期

时间:2017-11-27 09:30:26

标签: sql sql-server select top-n

我是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),因为我会得到不同行的结果,而且这不是一个选项。

回顾一下,我需要:

  • 每个唯一电子邮件的单行(因此分组)
  • 所选行是具有最新日期的行 - >最大值(日期)
  • 我需要IP和ID与max(date)选择的行位于同一行。

4 个答案:

答案 0 :(得分:4)

救援的窗口功能:

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()

答案 1 :(得分: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

答案 2 :(得分:1)

如果您有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 )

的索引,这将非常有用
{{1}}

答案 3 :(得分:0)

试试这个答案,

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

希望这会对你有所帮助。