Как я могу напечатать значение второй строки в столбце первой строки?

У меня есть выборка данных следующим образом:

start_date       end_date      amount   
12/10/2020          -          1800000
12/18/2020          -          1200000
01/18/2021          -          1000000

Я хотел бы напечатать дату начала второй строки до даты окончания первой строки для X строк, которые я извлекаю, чтобы таблица выглядела следующим образом:

start_date       end_date      amount   
12/10/2020      12/18/2020     1800000
12/18/2020      01/18/2021     1200000
01/18/2021          -          1000000

Всем спасибо!

Посмотрите на LAG/LEAD.

Thom A 21.12.2020 12:18

Это работает отлично! Я решил это с помощью функции LAG и предложения over! Большое спасибо!

Houssem Timoumi 21.12.2020 12:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
240
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Используйте LEAD следующим образом:

select start_Date,
       lead(start_date) over (order by start_Date) as end_Date
       amount
  from your_Table t

При этом ордер end_date не выбирается должным образом, это делается следующим образом: start_date end_date сумма 10.12.2020 18.12.2020 1800000 18.12.2020 - 1200000 18.01.2021 10.12.2020 1000000 Для второго и третьего ряда это делается неправильно, для первого только правильно.

Houssem Timoumi 21.12.2020 12:29

Является ли start_Date датой?

Popeye 21.12.2020 12:33

Исправлено при использовании реальной даты вместо конвертированной в nvarchar. Спасибо за совет!!

Houssem Timoumi 21.12.2020 12:39

Используйте ведущий, если у вас нет столбца для разделения, используйте только порядок в over()

   select start_date, 
           lead(start_date) over (partition by ... order by start_date) as end_date, 
           amount
   ...

При этом ордер end_date не выбирается должным образом, это делается следующим образом: start_date end_date сумма 10.12.2020 18.12.2020 1800000 18.12.2020 - 1200000 18.01.2021 10.12.2020 1000000 Для второго и третьего ряда это делается неправильно, для первого только правильно.

Houssem Timoumi 21.12.2020 12:27

Та же проблема, даты подтягиваются не туда

Houssem Timoumi 21.12.2020 12:37

Исправлено при использовании реальной даты вместо конвертированной в nvarchar.

Houssem Timoumi 21.12.2020 12:39

Использовал образец таблицы и выбрал данные. Пожалуйста, измените запрос SQL в соответствии с вашими потребностями.

DECLARE @Range TABLE (
    start_date DATETIME
    ,end_date DATETIME
    ,amount INT
    )

INSERT @Range
SELECT '12/10/2020'
    ,NULL
    ,1800000

UNION ALL

SELECT '12/18/2020'
    ,NULL
    ,1200000

UNION ALL

SELECT '01/18/2021'
    ,NULL
    ,1000000

SELECT start_date
    ,LEAD(start_date, 1) OVER (
        ORDER BY start_date
        ) AS end_date
    ,amount
FROM @Range;

Еще один вариант LEAD с использованием рекурсивного CTE.

DECLARE @T TABLE(start_date   DATE,    end_date   DATE,     amount   INT)

Insert into @T VALUES
('12/10/2020',NULL,1800000),
('12/18/2020',NULL,1200000),
('01/18/2021',NULL,1000000)

;WITH CTE AS(
                   SELECT rownum = ROW_NUMBER() OVER(ORDER BY End_Date),amount,Start_Date,End_Date
                   FROM @T
                 )
               SELECT
               CTE.start_date,CTE.amount,Nex.start_date AS[End Date]
               FROM CTE
               LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
               LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1

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