Скажите, есть ли у меня таблица со следующими данными:
ID Date
----------------------
2 2017/3/15
3 2017/6/20
5 2017/7/8
6 2018/1/3
7 2018/1/8
10 2018/2/20
11 2018/3/20
12 2018/4/1
Можно ли сделать команду select
, чтобы дата из предыдущая строка помещалась в текущую строку?
В результате:
ID Date PreDate
-------------------------------------
2 2017/3/15 NULL
3 2017/6/20 2017/3/15
5 2017/7/8 2017/6/20
6 2018/1/3 2017/7/8
7 2018/1/8 2018/1/3
10 2018/2/20 2018/1/8
11 2018/3/20 2018/2/20
12 2018/4/1 2018/3/20
Сделаю! Спасибо!!!
Да, вы можете использовать номер строки и присоединиться к отдельной таблице для этого, например
SELECT ID, Date, ROW_NUMBER() OVER(ORDER BY ID ASC) AS RowOrder,
INTO #tempTable
FROM MyTable
SELECT a.ID, a.Date as Date, b.Date as PreDate
FROM #tempTable a
LEFT JOIN #tempTable b ON b.RowOrder = a.RowOrder - 1
по предположению, что предыдущая строка, которая будет взята для столбца предшественника, основана на порядке столбца идентификатора
Вы не упомянули, какую версию используете.
Если в 2012+, вы можете использовать функцию LAG()
, которая делает именно то, что вам нужно. Первый параметр - это столбец, который нужно показать, второй - сколько строк назад вы будете извлекать данные, а третий - это значение, о котором будет сообщено, если предыдущая строка отсутствует. OVER
определит порядок расположения строк.
SELECT
T.ID,
T.Date,
PreviousDate = LAG(T.Date, 1, NULL) OVER (ORDER BY T.Date ASC)
FROM
YourTable AS T
Если на 2008+ вы можете использовать функцию ROW_NUMBER()
. В этом случае мы генерируем целочисленный номер строки по возрастанию и объединяем набор результатов с предыдущей строкой, уменьшая номер строки на 1.
;WITH RowNumering AS
(
SELECT
T.ID,
T.Date,
RowNumber = ROW_NUMBER() OVER (ORDER BY T.Date ASC)
FROM
YourTable AS T
)
SELECT
T1.ID,
T1.Date,
PreviousDate = T2.Date
FROM
RowNumering AS T1
LEFT JOIN RowNumering T2 ON T1.RowNumber - 1 = T2.RowNumber
Обе они называются "оконными функциями", было бы здорово, если бы вы потратили время, чтобы узнать, как их полностью использовать :)
Прочтите функцию LAG.