SQL查询以以下格式检索数据

时间:2018-12-26 20:51:10

标签: sql postgresql

__name__ == 'file1'

我正尝试根据以下逻辑使用 input 列创建 col1 col2 列:

  1. 每个 col1 的值与输入列
  2. 相同
  3. 每个 col2 的值是(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 )行。
  4. 最后一行将同时具有 col1 col2 值。

我正在尝试在SQL查询中实现逻辑,以根据上述逻辑获取 col1 col2 列。有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

为此创建了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行

,则Lead可以另外使用数字参数

我已经假设您的排序是按照input的日期的升序进行的,但是如果您希望通过其他方式定义行的顺序,请将其放在“ order by”内部“结束”

Lead将在最后一行返回null,因此我合并输入值以满足您的要求。 Lead确实具有一个可选参数,如果在偏移处没有行,则从当前行使用什么值,我只是倾向于不使用它,因为我发现它的可读性较差。 LEAD(input, 3, othercol)的意思是“给输入前3行的值,如果没有行则给出othercol。othercol可以是该行中的任何列,甚至是input

答案 1 :(得分:0)

我认为您可以使用窗口功能来完成您想做的事情:

select input, input as col1,
       lead(input, 1, input) over (order by input) as col2
from t;

答案 2 :(得分:0)

您的点编号2 尚不清楚,我在这里假设您要在输入值中添加1天来创建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>;