Напишите запрос, чтобы найти всех непостоянных клиентов (каждый с перерывом в 6 месяцев между встречами или люди, у которых менее двух встреч в год)
У меня возникла проблема, когда я должен вернуть только имя и фамилию клиентов, которые имеют
- разрыв между назначениями более 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?
Любая помощь будет принята с благодарностью. Спасибо за ваше время заранее.
2 ответа
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.date > t2.date
- Найдите максимальную дату t2.date - это даст вам за каждое посещение последнее назначение.
Из полученного набора,
выберите k_client_info, сгруппируйте по k_client_info, указав min(дата (мм, дата, prior_date)) > 5