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

问题描述 投票:0回答:1

我有2张桌子。

第一个表

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' |

第二个表

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'        |

我需要编写一个查询,返回

visit_type
表中每个用户会话的每个
Users
的访问次数,其中会话至少持续 90 天,并且
visit_date
落在会话范围内(包括日期) )。如果用户的会话没有任何特定类型的访问,则记录为 NULL 的
visit_type
和 0 的
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
;

从这段代码中,我期望输出记录每个用户和会话的

visit_date
visit_type
。唯一包含的会话是 90 天或更长的会话。

但是,我在使用

DATEDIFF
函数时遇到错误,提示我的参数不正确。

如何使用

DATEDIFF
过滤掉长度短于 90 天的会话?

sql-server join count datediff
1个回答
0
投票

这可能只是在 datediff 函数中使用

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

nb 这假设您正在使用 SQL Server。如果这是不正确的,请选择正确的 dbms 作为您问题下的标签。另请注意,“sql”不是“sql server”的别名。

© www.soinside.com 2019 - 2024. All rights reserved.