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;
我有这样的东西:
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;