使用COUNT(UserID)时拉出日期时间

时间:2015-09-11 11:10:09

标签: sql sql-server datetime count

我有表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次访问!

我也尝试过使用子查询,但是我收到了一个错误,因为它返回了多个结果。

我真的很难过!

2 个答案:

答案 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个记录的数量。使用外部查询,您可以准确地获取这些记录。

Demo here