Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

Столбец SQL

Резюме базовых знаний базы данных SQL

Резюме углубленных знаний базы данных SQL

В следующей таблице записаны имя и год команды-победителя:
Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

Напишите SQL-запрос, чтобы узнать, кто выигрывал чемпионаты подряд в течение этого периода, и каково время начала и окончания последующих лет?

результат поиска:

Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

Источник и ответ на этот вопрос доступны в Интернете. Подробности читайте в оригинальном скачке.

Ответ онлайн-справки решается с помощью PL / SQL, здесь мы используем SQL Server, чтобы увидеть, как это решить.

Конкретный код выглядит следующим образом:

CREATE TABLE  #t(TEAM varchar(20), Y int)
INSERT #t(TEAM,Y)  VALUES
('活塞',1990),
('公牛',1991),
('公牛',1992),
('公牛',1993),
('火箭',1994),
('火箭',1995),
('公牛',1996),
('公牛',1997),
('公牛',1998),
('马刺',1999),
('湖人',2000),
('湖人',2001),
('湖人',2002),
('马刺',2003),
('活塞',2004),
('马刺',2005),
('热火',2006),
('马刺',2007),
('凯尔特人',2008),
('湖人',2009),
('湖人',2010);

SELECT RN=IDENTITY(INT),* INTO #a FROM #t ORDER BY TEAM,Y

   SELECT a.TEAM,
   MIN(a.Y) B,
   MAX(a.Y) E
   FROM #a a
   WHERE EXISTS(
     SELECT 1 FROM #a
     WHERE TEAM=a.TEAM
     AND (Y=a.Y-1 OR a.Y=Y-1)
   )
   GROUP BY a.TEAM,Y-RN

DROP TABLE #t,#a

Результат ответа следующий:

Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

Давайте интерпретируем приведенное выше решение:

Первый - добавить к данным саморазрастающийся столбец RN, вставить его в новую временную таблицу #a и отсортировать TEAM и Y.

Второй - самосопоставление #a. Условие сопоставления состоит в том, что имя КОМАНДЫ совпадает (TEAM = a.TEAM), а год Y совпадает с предыдущим и последующим годами (Y = aY-1 ИЛИ aY = Y- 1).

Этот матч - одна из тонкостей, чтобы можно было определить, есть ли у команды годы подряд.

Если названия команд совпадают, а годы идут подряд, это условие выполняется;

Если годы идут подряд, но названия команд не совпадают, это условие не выполняется.

Наконец, при группировке была сгруппирована не только команда TEAM, но и Y-RN. Почему вы хотите объединиться в группу Y-RN?

Если мы удалим это условие, мы обнаружим следующую ситуацию:

Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

«Буллз» и «Лейкерс» потребовалось несколько лет, чтобы снова выиграть последовательные чемпионаты, но из-за отсутствия группировки Y-RN эта команда и год чемпионата удовлетворены, когда они совпадают. Поскольку содержимое таблицы #a на самом деле такое,

Что касается SQL-запроса команды НБА, выигравшей чемпионаты подряд, решение очень тонкое ~

Y = aY-1 ИЛИ aY = Y-1 Пока выполняется одно из них, год можно рассматривать как непрерывный. Фактически, вышеуказанные условия действительно выполняются после нашей обработки, поэтому нам нужно добавить Y- RN для второй группировки, чтобы определить, является ли середина Годы с интервалами.

Это очень интересный вопрос, возможно, вы захотите попробовать его сами, возможно, вы проверите его на следующем собеседовании ~

рекомендация

отblog.51cto.com/15057820/2656047