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。语法和特征的差异通常会影响答案。