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

标签 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 不在 (max) 聚合函数中。但我需要 IP 与 ID 和日期相匹配,所以我不能在这些列中使用 (max),因为我会从不同的行中获得结果,而这不是一个选项。

回顾一下,我需要:

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

最佳答案

救援窗口函数:

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

关于sql - 从由其他列聚合并选择最大日期的列中获取任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507620/

相关文章:

MySQL 子查询的 IF 语句

c# - 从 C# winform 中的 SQL 存储过程返回结果和消息

php - 从我的 SELECT 语句中只返回 4 个 ID

javascript - 如何使用 JavaScript 创建唯一 ID?

mysql - 如何通过select mysql更新

sql - FLOAT 如何映射/关联到 Oracle 10g 中的 NUMBER?

mysql - 插入表 - 丢弃键可以为空的重复项

sql - row_number() 如何工作?

.net - 默认网络数据包大小的差异 : SqlConnection vs. SQL Server 默认值

mysql - 在一个查询中对一个表中的不同值求和