Sql 基于计数、时间范围和位置的查询
好的,我需要写一个查询,我可能要做的比它需要的复杂得多,但我需要一些帮助 我需要选择一年或更长时间内没有见过我们的客户的记录,这些客户见过我们不止一次,但如果不在某些位置,则只能见过我们一次 到目前为止,我得到的是:Sql 基于计数、时间范围和位置的查询,sql,tsql,Sql,Tsql,好的,我需要写一个查询,我可能要做的比它需要的复杂得多,但我需要一些帮助 我需要选择一年或更长时间内没有见过我们的客户的记录,这些客户见过我们不止一次,但如果不在某些位置,则只能见过我们一次 到目前为止,我得到的是: WITH CTE AS ( SELECT client_id, location_id, employee_id, create_timestamp, ROW_NUMBER() OVER(PARTITION BY person_id
WITH CTE AS
(
SELECT
client_id,
location_id,
employee_id,
create_timestamp,
ROW_NUMBER() OVER(PARTITION BY person_id ORDER BY create_timestamp DESC) AS ROW
FROM
client_Appointment
)
SELECT
c.client_id,
COUNT(*)
FROM
CTE AS ce
INNER JOIN person AS c
ON p.person_id= ce.client_id
INNER JOIN employee_mstr AS em
ON em.employee_id = ce.empoyee_id
INNER JOIN location_mstr AS lm
ON lm.location_id = ce.location_id
WHERE
ce.create_timestamp <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120)
GROUP BY
p.person_id
HAVING
COUNT(*) > 1
我不知道从这里到哪里去。此外,这并不能获得我需要的所有信息,如果我将这些信息添加到select子句中,我必须在组中使用它,这意味着我无法获得所有需要的记录。
谢谢所以您只需要一年或更长时间未见面的客户, 然后是一次访问不在特定地点或多次访问的客户。我说对了吗 注意:只需将值1、2、3替换为表名即可
WITH CTE_visits
AS
(
SELECT
c.client_id,
COUNT(*) AS total_visits,
SUM(
CASE
WHEN ce.location_id IN (SELECT ID FROM (VALUES(1),(2),(3)) AS A(ID)) THEN 0 --so when it is a certain location then do NOT count it
ELSE 1 --if it is not at the certain locations, then count it
END
) AS visits_not_at_certain_locations
FROM
client_Appointment AS ce
INNER JOIN person AS c
ON p.person_id= ce.client_id
INNER JOIN employee_mstr AS em
ON em.employee_id = ce.empoyee_id
INNER JOIN location_mstr AS lm
ON lm.location_id = ce.location_id
CROSS APPLY(SELECT client_id, MAX(create_timestamp) last_visit FROM client_Appointment WHERE client_id = ce.client_id GROUP BY client_id) CA --find most recent visit for each client_id
WHERE
ce.create_timestamp <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120) --remember this only counts visits over a year ago
AND last_visit <= CONVERT(VARCHAR(10), DATEADD(Year,-1,GETDATE()), 120) --says only return client_id's who's last visit is more than a year ago
GROUP BY
p.person_id
)
SELECT *
FROM CTE_visits
WHERE visits_not_at_certain_locations = 1 --seen once NOT at certain locations
OR total_visits > 1 --seen more than once at any location
请添加示例数据以及当前和预期的输出。使用适当的软件MySQL、Oracle、DB2。。。和版本,例如sql-server-2014。语法和特征的差异通常会影响答案。