Столбец 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
Результат ответа следующий:
Давайте интерпретируем приведенное выше решение:
Первый - добавить к данным саморазрастающийся столбец RN, вставить его в новую временную таблицу #a и отсортировать TEAM и Y.
Второй - самосопоставление #a. Условие сопоставления состоит в том, что имя КОМАНДЫ совпадает (TEAM = a.TEAM), а год Y совпадает с предыдущим и последующим годами (Y = aY-1 ИЛИ aY = Y- 1).
Этот матч - одна из тонкостей, чтобы можно было определить, есть ли у команды годы подряд.
Если названия команд совпадают, а годы идут подряд, это условие выполняется;
Если годы идут подряд, но названия команд не совпадают, это условие не выполняется.
Наконец, при группировке была сгруппирована не только команда TEAM, но и Y-RN. Почему вы хотите объединиться в группу Y-RN?
Если мы удалим это условие, мы обнаружим следующую ситуацию:
«Буллз» и «Лейкерс» потребовалось несколько лет, чтобы снова выиграть последовательные чемпионаты, но из-за отсутствия группировки Y-RN эта команда и год чемпионата удовлетворены, когда они совпадают. Поскольку содержимое таблицы #a на самом деле такое,
Y = aY-1 ИЛИ aY = Y-1 Пока выполняется одно из них, год можно рассматривать как непрерывный. Фактически, вышеуказанные условия действительно выполняются после нашей обработки, поэтому нам нужно добавить Y- RN для второй группировки, чтобы определить, является ли середина Годы с интервалами.
Это очень интересный вопрос, возможно, вы захотите попробовать его сами, возможно, вы проверите его на следующем собеседовании ~