提问人:stargirl871 提问时间:8/26/2023 最后编辑:stargirl871 更新时间:8/27/2023 访问量:39
MS SQL Server:如何获取每个用户每个日期范围的每种访问类型的计数?
MS SQL Server: How to get the counts of each visit type per date range per user?
问:
我有 2 张桌子。
第一个表包含属性和 .是一个唯一标识每个用户的 int。是一个 int,用于跟踪每个用户的每个连续日期范围。 并反映每个用户每次会话的日期范围。用户可以在此表中多次显示,您可以假设,如果用户多次被包含,则其下一个会话将发生在上一个会话之后。Users
id, session, start_date,
end_date
id
session
start_date
end_date
start_date
end_date
下面是该表的示例:Users
| id | session | start_date | end_date |
|----|---------|--------------|--------------|
| 1 | 1 | '2017-01-01' | '2017-03-01' |
| 1 | 2 | '2017-04-01' | '2017-10-01' |
| 2 | 1 | '2017-01-01' | '2017-12-31' |
| 3 | 1 | '2017-01-01' | '2017-12-31' |
第二个表包含属性和 . 与表中相同。 (date) 和 (string) 详细说明每个用户的访问日期和每次访问的类型。用户可以在此表中多次显示,也可以根本不显示。Visits
id, visit_date,
visit_type
id
id
Users
visit_date
visit_type
下面是该表的示例:Visits
| id | visit_date | visit_type |
|----|--------------|------------|
| 1 | '2017-01-05' | 'a' |
| 1 | '2017-02-06' | 'a' |
| 1 | '2017-04-01' | 'a' |
| 1 | '2017-05-02' | 'b' |
| 1 | '2017-06-13' | 'b' |
| 1 | '2017-01-12' | 'c' |
| 2 | '2017-04-01' | 'a' |
| 2 | '2017-12-01' | 'd' |
我需要编写一个查询,该查询返回表中每个用户会话的访问次数,其中会话长度至少为 90 天,并且属于会话范围(包括日期)。如果用户的会话没有任何特定类型的访问,则将其记录为 NULL 和 0。visit_type
Users
visit_date
visit_type
visit_count
以下是基于上表的所需输出:
-- |id|session|start_date |end_date |visit_type|visit_count|
-- |1 |2 |'2017-04-01'|'2017-10-01'|’a’ |1 |
-- |1 |2 |'2017-04-01'|'2017-10-01'|’b’ |2 |
-- |2 |1 |'2017-01-01'|'2017-12-31'|’a’ |1 |
-- |2 |1 |'2017-01-01'|'2017-12-31'|’d’ |1 |
-- |3 |1 |'2017-01-01'|'2017-12-31'|NULL |0 |
SELECT Users.id, Users.session, Users.start_date, Users.end_date,
Visits.visit_date, Visits.visit_type
FROM Users
LEFT JOIN Visits ON Users.id = Visits.id
WHERE (
DATEDIFF(DAY, Users.start_date, Users.end_date) >= 90
)
ORDER BY Users.id, Users.session
;
从这段代码中,我期望得到一个输出,其中记录了每个用户和会话的 和。唯一包括的会议是 90 天或更长时间的会议。visit_date
visit_type
但是,我在使用函数时遇到错误,它说我的参数不正确。DATEDIFF
如何使用筛选出长度短于 90 天的会话?DATEDIFF
答:
这可能只是使用 datediff 函数而不是 datediff 函数的问题,但您似乎还需要一个 a group by 来实现访问计数:day
DAY
SELECT
Users.id
, Users.session
, Users.start_date
, Users.end_date
, Visits.visit_type
, COUNT(Visits.visit_type) AS visit_count
FROM Users
LEFT JOIN Visits ON Users.id = Visits.id
WHERE DATEDIFF(day, Users.start_date, Users.end_date) >= 90
AND Visits.visit_date BETWEEN Users.start_date AND Users.end_date
GROUP BY
Users.id
, Users.session
, Users.start_date
, Users.end_date
, Visits.visit_type
ORDER BY
Users.id
, Users.session
请参见: TSQL datediff
注意,这假定您使用的是 SQL Server。如果这是不正确的,请选择正确的 dbms 作为问题下的标签。另请注意,“sql”不是“sql server”的别名。
上一个:计算两个日期之间的天数
评论