SQL-запрос для получения данных в следующем формате - PullRequest
0 голосов
/ 26 декабря 2018
input               col1                col2
---------------------------------------------------------
12/8/2018 1:45      12/8/2018 1:45      12/8/2018 11:03
12/8/2018 11:03     12/8/2018 11:03     12/11/2018 13:26
12/11/2018 13:26    12/11/2018 13:26    12/13/2018 17:21
12/13/2018 17:21    12/13/2018 17:21    12/23/2018 17:21
12/23/2018 17:21    12/23/2018 17:21    12/24/2018 16:17
12/24/2018 16:17    12/24/2018 16:17    12/24/2018 16:17

Я пытаюсь создать столбцы col1 и col2 , используя input column, основываясь на логике ниже:

  1. Каждое значение col1 совпадает с входным столбцом
  2. Каждое значение col2 является строкой (input + 1).
  3. В последней строке оба значения будут col1 и col2 одинаковыми.

Я пытаюсь реализовать логику вЗапрос SQL для получения столбцов col1 и col2 на основе приведенной выше логики.Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Для этого была создана аналитическая функция LEAD:

SELECT
  input,
  input as col1,
  COALESCE(LEAD(input) OVER(ORDER BY input), input) as col2
FROM table

Lead возвращает заданное значение из строки "next", значение "next" выводится из предложения ORDER BY.Ведущий может дополнительно принимать числовой аргумент, если вы хотите, чтобы значение было 2, 3, N строк впереди

Я сделал предположение, что ваш порядок в порядке возрастания даты, в которой input, но еслиВы хотите, чтобы что-то еще определяло порядок строк, поместите его в "order by" внутри "over"

Lead вернет ноль в последней строке, поэтому я объединю входное значение, чтобы оно соответствовало вашемуспекуляцияУ Lead есть необязательный параметр того, какое значение использовать из текущей строки, если в смещении нет строки, я просто не использую его, так как считаю его менее читабельным.LEAD(input, 3, othercol) означает "дать значение ввода от 3-х строк впереди или дать othercol, если строки нет. Othercol может быть любым столбцом из строки, даже input снова

0 голосов
/ 27 декабря 2018

Ваша точка № 2 неясна, и я предположил, что вы хотите добавить 1 день к значению input , чтобы создать что-то для col2.

Вот один из способов сделать это:

SELECT input, input AS col1, (
  CASE
     WHEN id != (SELECT MAX(id) FROM <table_name>) /** last item assumed to have the highest id */
      THEN
        input + INTERVAL '1 day'
      ELSE
        input
  END
  ) AS col2
FROM <table_name>;
0 голосов
/ 26 декабря 2018

Я думаю, что вы можете делать, что хотите, используя оконные функции:

select input, input as col1,
       lead(input, 1, input) over (order by input) as col2
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...