MS SQL Server:如何获取每个用户每个日期范围的每种访问类型的计数?

MS SQL Server: How to get the counts of each visit type per date range per user?

提问人:stargirl871 提问时间:8/26/2023 最后编辑:stargirl871 更新时间:8/27/2023 访问量:39

问:

我有 2 张桌子。

第一个表包含属性和 .是一个唯一标识每个用户的 int。是一个 int,用于跟踪每个用户的每个连续日期范围。 并反映每个用户每次会话的日期范围。用户可以在此表中多次显示,您可以假设,如果用户多次被包含,则其下一个会话将发生在上一个会话之后。Usersid, session, start_date,end_dateidsessionstart_dateend_datestart_dateend_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) 详细说明每个用户的访问日期和每次访问的类型。用户可以在此表中多次显示,也可以根本不显示。Visitsid, visit_date,visit_typeididUsersvisit_datevisit_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_typeUsersvisit_datevisit_typevisit_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_datevisit_type

但是,我在使用函数时遇到错误,它说我的参数不正确。DATEDIFF

如何使用筛选出长度短于 90 天的会话?DATEDIFF

sql-server 联接 计数 datediff

评论

1赞 nbk 8/26/2023
您使用的是哪个数据库系统,每个系统都有自己的功能
0赞 Adrian Maxwell 8/26/2023
关于标签“SQL”,如果您将鼠标悬停在该标签上,请阅读其描述:“结构化查询语言 (SQL) 是一种用于查询数据库的语言。问题应包括代码示例、表结构、示例数据以及正在使用的 DBMS 实现(例如 MySQL、PostgreSQL、Oracle、MS SQL Server、IBM DB2 等)的标签。如果您的问题仅与特定 DBMS(使用特定扩展/功能)相关,请改用该 DBMS 的标记。用 SQL 标记的问题的答案应使用 ISO/IEC 标准 SQL"

答:

0赞 Adrian Maxwell 8/26/2023 #1

这可能只是使用 datediff 函数而不是 datediff 函数的问题,但您似乎还需要一个 a group by 来实现访问计数:dayDAY

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”的别名。