Как получить результат из другой строки в SQL Server?

Скажите, есть ли у меня таблица со следующими данными:

    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

Прочтите функцию LAG.

P.Salmon 02.05.2018 08:48

Сделаю! Спасибо!!!

Pikachu620 02.05.2018 08:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, вы можете использовать номер строки и присоединиться к отдельной таблице для этого, например

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

по предположению, что предыдущая строка, которая будет взята для столбца предшественника, основана на порядке столбца идентификатора

Alfin E. R. 02.05.2018 08:57
Ответ принят как подходящий

Вы не упомянули, какую версию используете.

Если в 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

Обе они называются "оконными функциями", было бы здорово, если бы вы потратили время, чтобы узнать, как их полностью использовать :)

Другие вопросы по теме