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



我遇到了一个问题,我必须只返回具有以下任一

  1. 预约间隔超过6个月
  2. 每年 2 次或更少的预约

对于任命表中存在的每一年。这是约会表和客户表的创建

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 个月的所有客户。我想过在client_info表上运行选择并在约会表上加入两次,并以某种方式让他们排队并按正确的顺序排列,以便我可以比较日期。也许我需要做一个ROW_NUMBER OVER PARTION BY k_client_info?

任何帮助将不胜感激。提前感谢您的时间。

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
  • 左外 在 t1.pk_client_info = t2.pk_client_info 上将约会表连接到自身和 t1.日期> t2.日期
  • 找到最大 t2.date - 这将为您提供每个约会之前的最后一次约会。

从结果集合中,

选择k_client_info,按k_client_info分组,最小值(日期差异(毫米,日期,prior_date))> 5