SQL查询 - Microsoft SQL

时间:2016-01-19 08:42:33

标签: sql sql-server ssms

我有这样的事情:

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

现在,我需要让所有至少有3个会话且至少有一个会话的用户在2015年。

SELECT must have USERS.*, lastSessionDate and sessionCount

我正在使用microsoft sql server,任何帮助都将不胜感激。

编辑(我到目前为止):

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

4 个答案:

答案 0 :(得分:1)

有一个派生表,您可以在其中计算每个用户ID的会话和2015会话。使用该表加入用户表:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

试试这个:

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'

答案 3 :(得分:0)

这里列出了您需要的所有列:

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;