我有表Users
UserID FirstName LastName Email
------ --------- -------- -----
1 Fred Smith fs@abc.com
2 Bob Hill bh@abc.com
3 Jane Doe jd@abc.com
和LoginSession
LoginSessionID UserID StartDate
-------------- ------ ---------
1 1 2014-11-23 08:37:14.836
2 1 2014-11-25 11:13:53.225
3 2 2014-12-01 03:15:33.846
4 1 2014-12-01 17:34:19.036
5 3 2014-12-05 12:55:01.998
6 1 2014-12-14 17:20:14.636
7 3 2014-12-15 10:02:17.376
我要做的是找到只登录过一次的用户,然后找出它的用途。
我设法找到使用
登录一次的用户SELECT
U.FirstName, U.LastName, COUNT(L.UserID) AS Visits
FROM
LoginSession L
JOIN
Users U ON U.UserID = L.UserID
GROUP BY
U.FirstName, U.LastName
HAVING
COUNT(L.UserID) = 1
但我也希望了解这些用户的L.StartDate
。如果我将它添加到select查询中,我会收到一个错误,因为它不包含在聚合函数或GROUP BY
子句中。如果我将其添加到GROUP BY
行(以避免该错误),我会将每个登录信息轻松标记为1次访问!
我也尝试过使用子查询,但是我收到了一个错误,因为它返回了多个结果。
我真的很难过!
答案 0 :(得分:1)
您可以通过聚合执行此操作:
select UserId, min(StartDate) as StartDate
from LoginSession ls
group by UserId
having count(*) = 1;
min()
返回您想要的值,因为只有一行匹配。您可以使用添加join
来获取有关用户的其他信息。
select u.*, lsu.StartDate
from Users u join
(select UserId, min(StartDate) as StartDate
from LoginSession ls
group by UserId
having count(*) = 1
) lsu
on lsu.UserId = u.UserId;
答案 1 :(得分:0)
您可以使用COUNT
的窗口版本:
SELECT FirstName, LastName, StartDate
FROM (
SELECT U.FirstName, U.LastName, L.StartDate,
COUNT(*) OVER (PARTITION BY U.UserID) AS cnt
FROM LoginSession L
JOIN Users U ON U.UserID = L.UserID ) AS t
WHERE t.cnt = 1
带有COUNT
子句的 OVER
将返回每U.UserID
个记录的数量。使用外部查询,您可以准确地获取这些记录。