SQL 查询 - 微软 SQL

SQL Query - Microsoft SQL

我有这样的东西:

USERS (ID, name);
SESSIONS (ID, userID, date)

现在,我需要获取至少有 3 个会话且其中至少一个会话是在 2015 年的所有用户。

SELECT must have USERS.*, lastSessionDate and sessionCount

我正在使用 Microsoft sql 服务器,如有任何帮助,我们将不胜感激。

编辑(我目前拥有的):

SELECT ID, name,
    (SELECT COUNT(*)
    FROM SESSIONS 
    WHERE SESSIONS.userID = ID
    AND ((SELECT MAX(date)
        FROM SESSIONS 
        WHERE SESSIONS.userID = ID) > '2014-12-31')) AS sessionCount
FROM USERS
WHERE (SELECT COUNT(*)
    FROM SESSIONS
    WHERE SESSIONS.userID = ID
    AND ((SELECT MAX(date)
        FROM SESSIONS
        WHERE SESSIONS.userID = ID) > '2014-12-31')) > 2
/*
GROUP BY ID, name
HAVING (SELECT MAX(date)
        FROM SESSIONS
        WHERE SESSIONS.userID = ID) > '2014-12-31'
*/
ORDER BY sessionCount DESC

这不是最好的解决方案,但您可以这样做:

SELECT
    *
FROM
    users
WHERE 
    (
        SELECT COUNT(*) 
        FROM sessions 
        WHERE sessions.userID=users.ID
    )>3
AND 
    (
        SELECT COUNT(*) 
        FROM sessions 
        WHERE sessions.userID=users.ID 
        AND YEAR(sessions.date)=2015
    )>=1

更好的解决方案是这样的:

SELECT
    *
FROM
    users
    JOIN
    (
        SELECT 
            sessions.userID,
            COUNT(*) AS nbrOf,
            SUM(CASE WHEN YEAR(sessions.date)=2015 THEN 1 ELSE 0 END) AS nbrOfYear
        FROM 
            sessions
        GROUP BY
            sessions.userID
    ) as tbl
    ON users.id=tbl.userID
    AND tbl.nbrOf>3
    AND tbl.nbrOfYear>=1

有一个派生的 table,您可以在其中计算每个用户 ID 的会话数和 2015 年会话数。将用户 table 加入 table:

select u.ID, u.name
from users u
join (select id, count(*) as cnt, sum(case when YEAR(date) = 2015 then 1 end) as cnt2015
      from sessions
      group by id) s on u.id = s.id
where s.cnt >= 3 and s.cnt2015 >= 1

试试这个:

SELECT 
  u.ID,
  u.name, 
  MAX(Date) lastsessiondate
FROM 
  USERS u
JOIN
  [SESSIONS] s
ON 
  u.ID = s.userID
GROUP BY 
  u.ID, u.name
HAVING 
  COUNT(*) > 2
  and MAX(CASE WHEN Date>= '2016-01-01' THEN '2014-01-01' ELSE Date END) >= '2015-01-01'

这里是您需要的所有栏目:

WITH cte
as
(
    SELECT userId, count(*) as c, MAX(date) as lastDate
        FROM SESSIONS
        WHERE userId IN (SELECT userId FROM SESSIONS WHERE DATEPART(year, date) = 2015) -- filter 2015 year
        GROUP BY s.userId
        HAVING count(*) > 2 -- filter at least 3 sessions
)
SELECT u.*, cte.c as sessionCount, cte.lastDate as lastSessionDate
    FROM USERS u
    INNER JOIN cte on u.Id = cte.userId;