我是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),因为我会得到不同行的结果,而且这不是一个选项。
回顾一下,我需要:
答案 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
希望这会对你有所帮助。