Напишите запрос, чтобы найти всех непостоянных клиентов (каждый с перерывом в 6 месяцев между встречами или люди, у которых менее двух встреч в год)

У меня возникла проблема, когда я должен вернуть только имя и фамилию клиентов, которые имеют

  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?

Любая помощь будет принята с благодарностью. Спасибо за ваше время заранее.

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

Другие вопросы по тегам