купил фильм раньше, чем Gladiator дата SQL SERVER

Мне нужно руководство и помощь с вопросом, который я никогда не делал в SQL SERVER.

У меня есть следующие данные:

Cust_Nr Date FilmName 157649306 20150430 Inside Llewyn Davis 158470722 20150504 Nick Cave: 20,000 Days On Earth 158467945 20150504 Out Of The Furnace 158470531 20150504 FilmA 157649306 20150510 Gladiator 158470722 20150515 Gladiator 

Номер клиента: 158470722 купил два фильма: 1 ):Inside Llewyn Davis и 2) Gladiator в разные даты. То, что я пытаюсь сделать в SQL SERVER, заключается в следующем:

  Cust_Nr Date FilmName Before Gladiator Purchase 157649306 20150430 Inside Llewyn Davis 1 158470722 20150504 Nick Cave: 20,000 Days On Earth 1 158467945 20150504 Out Of The Furnace 0 158470531 20150504 FilmA 0 157649306 20150510 Gladiator 0 158470722 20150515 Gladiator 0 

Если мы посмотрим даты для клиента nr: 157649306 , он купил фильм на дату 20150430 и приобрел Gladiator на 20150510. Как я могу создать столбец, подобный приведенному выше, чтобы показать, приобрел ли клиент фильм на дату раньше даты гладиатора?

Вы можете сделать это с помощью условной агрегации и оконной / аналитической функциональности:

 SELECT *,CASE WHEN [Date] < MIN(CASE WHEN FilmName = 'Gladiator' THEN [Date] END) OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END AS Before_Gladiator FROM Table1 

Демо: SQL Fiddle

Вам нужно агрегирование и детали в одном и том же запросе, поэтому используйте функцию Windowed Aggregate:

 case when Date < min(case when FilmName = 'Gladiator' then Date end) over (partition by Cust_Nr) then 1 else 0 end 

Вы можете присоединиться к таблице с запросом на гладиаторский фильм:

 SELECT t.*, CASE WHEN g_date IS NULL OR t.[date] > g_date THEN 1 ELSE 0 END FROM mytable t LEFT JOIN (SELECT [date] AS g_date, Cust_Nr FROM mytable WHERE FileName = 'Gladiator') g ON t.Cust_Nr = g.Cust_Nr