我是一个 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/