编写查询以查找所有间歇性客户(约会之间有 6 个月间隔的每个人,或一年约会少于 2 次的人)

Write a query to find all intermittent clients (everyone with a 6 months gap between appointments, or people who have less than 2 appointments a year)

我遇到了一个问题,我必须 return 只有具有

的客户的名字和姓氏
  1. 两次约会之间的间隔大于 6 个月
  2. 每年 2 次或更少的约会

年的任命table。 这是约会 table 和客户 table

的创建
CREATE TABLE [dbo].[Appointments](
[pk_appointments] [int] IDENTITY(1,1) NOT NULL,
[k_client_info] [int] NOT NULL,
[date] [datetime] NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[client_info](
[pk_client_info] [int] IDENTITY(1,1) NOT NULL,
[first_name] [nvarchar](50) NOT NULL,
[last_name] [nvarchar](50) NOT NULL,
[phone] [nvarchar](50) NOT NULL,
) ON [PRIMARY]

我的想法是编写两个同时满足 1 和 2 的查询,并将它们联合在一起。我有2.如下:

SELECT DISTINCT first_name, last_name
FROM client_info
LEFT JOIN appointments ON pk_client_info = k_client_info
GROUP BY first_name, last_name, k_client_info, year(date)
HAVING COUNT(*) <= 2

但我在思考如何编写满足 1 的查询时遇到了一些麻烦,即查找约会间隔大于 6 个月的所有客户。我想 运行 select 在 client_info table 上参加约会 table 两次,并以某种方式让他们排队并按正确的顺序排列这样我就可以比较日期。也许我需要做一个 ROW_NUMBER OVER PARTION BY k_client_info?

如有任何帮助,我们将不胜感激。感谢您提前抽出时间。

  • left outer 在 t1.pk_client_info = t2.pk_client_info 上加入对自己的约会 table 和 t1.date > t2.date
  • 找到最大值 t2.date - 这将为您提供每次约会之前的最后一次约会。

从结果集中,

select k_client_info,按 k_client_info 分组,具有 min(datediff(mm, date, prior_date)) > 5

SELECT a1.k_client_info

FROM [dbo].[Appointments] a1
    CROSS APPLY (SELECT top 1 a2.[date], a2.[pk_appointments] 
                    FROM [dbo].[Appointments] a2 
                    WHERE a1.k_client_info = a2.k_client_info AND a1.[date] > a2.[date] 
                    order by a2.[date] DESC) a3
WHERE DATEDIFF(MONTH, a3.[date], a1.[date]) >= 6

UNION ALL

SELECT k_client_info
FROM [dbo].[Appointments]
GROUP BY YEAR(DATE), k_client_info
HAVING COUNT(*) < 2