2015-05-19 2 views
1

Мне нужно руководство и помощь с вопросом, который я никогда не делал в SQL SERVER.купил фильм раньше, чем Gladiator дата 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 

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

ответ

2

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

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

2

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

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

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

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 
Смежные вопросы