Название может не иметь смысла, поэтому я предоставлю некоторый контекст.SQL - Получите минимально минимальные числа
У меня есть стол, назовите его Кино.
Фильм кортеж имеет значения: Имя, директор, жанр,
ГодЯ пытаюсь создать запрос, который позволяет мне вернуть все директора, которые никогда не выпустили два последовательных фильмов ужасов с более чем 4-х лет Кроме.
Я не уверен, где бы я начал, но я пытаюсь начать с создания запроса, который задал определенный год, возвращает следующий минимальный год, чтобы я мог проверить, существует ли разница между этими двумя менее 4, и продолжайте делать это для всех фильмов.
Моя попытка была:
SELECT D1.Director
FROM Movies D1
WHERE D1.Director NOT IN
(SELECT D2.Director FROM Director D2
WHERE D2.Director = D1.Director
AND D2.Genre = 'Horror'
AND D1.Genre = 'Horror' AND D2.Year - D1.Year > 4
OR D1.Year - D2.Year > 4)
, который не работает по очевидным причинам.
У меня также было несколько попыток с помощью объединений, и оно работает над фильмами, которые следуют примеру 2000, 2003, 2006, но не удается, если более 3-х фильмов.
Спасибо за ответ. Как работают LAG и PARTITION - я никогда не использовал эти 2 функции. – user3186023
LAG - это то, что называется оконной функцией, оно работает подобно RANK и ROW_NUMBER. LAG вернет предыдущую запись (в соответствии с компонентом ORDER BY), LEAD вернет следующую запись, RANK вернет ранжирование с помощью связей {(1,1,2,3) => (1,1,3,4) } ROW_NUMBER вернет номер строки {(1,1,2,2) => (1,2,3,4)}. В принципе, PARTITION будет работать подобно команде group by, что означает, что ранг будет сброшен с каждой другой комбинацией. Это означает, что LAG вернет предыдущий год для этого имени/режиссера/жанра и вернет NULL, когда нет предыдущей записи. – hcaelxxam
Вы также можете проверить https://msdn.microsoft.com/en-us/library/hh231256.aspx. – hcaelxxam