我有这样的事情:
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
答案 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;