Интересно, что заставляет вас думать, что ваш код лучше
Прежде всего, при должном уважении, без обид.
order by
case when membership_end_date is null then 0 else 1 end,
case when membership_end_date <> membership_effective_date then 0 else 1 end,
membership_end_date desc
Я понятия не имею, как выглядят реальные данные.
Я буду избегать Row_Number
и Inequakity Operator
, если у меня будет много строк для обработки.
Inequakity Operator
часто Сканирование полной таблицы, чтобы проверить состояние Inequakity
. Я в этом уверен.
Это тоже Inequakity Operator
в Order by
предложении вместе с описанием дела и Row_Number
.
Это может сокрушить Sql Optimizer
.
Я не говорю, что всегда избегаю Row_Number
Также вы ничего не упомянули о Membership_Effective_Date
Попробуйте приведенный ниже скрипт с различными примерами данных,
create table customers1(Name varchar(40), ID int
, Membership_Effective_Date datetime, Membership_End_Date datetime)
insert into customers1 values
('Bob', 1 ,'2020-01-01' , NULL)
,('Bob', 1 ,'2017-01-01' , '1/2/2017')
,('Bob', 1 ,'2017-01-01' , '9/1/2018')
,('Kim', 2 ,'2019-01-01' , '1/1/2020')
,('Kim', 2 ,'2019-01-01' , '12/31/2019')
,('Susan', 3 ,'2018-01-01' , '12/31/2018')
,('Susan', 3 ,'2019-01-01' , '1/1/2019')
,('Larry', 4 ,'2020-01-01' , '1/1/2020')
SELECT ID
,NAME
,Membership_Effective_Date
,Membership_End_Date
INTO #temp
FROM customers1
WHERE Membership_End_Date IS NULL
OPTION (MAXDOP 1)
SELECT ID
,NAME
,Membership_Effective_Date
,Membership_End_Date
FROM #temp
UNION ALL
SELECT t.ID
,t.NAME
,min(t.Membership_Effective_Date) AS Membership_Effective_Date
,max(t.Membership_End_Date) AS Membership_End_Date
FROM customers1 t
WHERE Membership_End_Date IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM #temp ac
WHERE ac.ID = t.ID
)
GROUP BY t.ID
,t.NAME
OPTION (MAXDOP 1)
drop table #temp
drop table customers1
Да Вы были правы раньше, когда я использовал CTE, он имел бы Scan
как минимум дважды.
Теперь я использую #temp
таблицу, но идея та же, что и раньше.
Более или менее я придерживаюсь только с этой идеей.