我遇到了一个问题,我必须只返回具有以下任一
- 预约间隔超过6个月
- 每年 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