postgresql SQL如何根据相同的键减去同一列的2行值

zujrkrfu  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(4)|浏览(125)

如何提取具有相同id的多行的特定列的差异?
示例表:
| 标识符|上一个瓦尔|新瓦尔|日期|
| - -|- -|- -|- -|
| 一个|第0页|一个|2020年1月1日10时|
| 一个|一个|2个|2020年1月1日11时|
| 2个|第0页|一个|2020年1月1日10时|
| 2个|一个|2个|2020年1月2日10时|
预期结果:
| 标识符|持续时间(小时)|
| - -|- -|
| 一个|一个|
| 2个|二十四|
摘要:id=1,(2020-01-01 10:00 - 2020-01-01 11:00)为1小时;
id=2,(2020年1月1日10:00 - 2020年1月2日10:00)为24小时制
我们能否通过SQL实现这一点?

vx6bjr1n

vx6bjr1n1#

这种解决方案将是一种有效的方法

with pd as (
select
    id,
    max(date) filter (where c.old_value = '0') as "prev",
    max(date) filter (where c.old_value = '1') as "new"
from
    table
group by
    id )
select
    id ,
    new - prev as diff
from
    pd;
xwbd5t1u

xwbd5t1u2#

如果你需要连续读数之间的差异,类似这样的东西应该会起作用

select a.id, a.new_val, a.date - b.date
from my_table a join my_table b 
     on a.id = b.id and a.prev_val = b.new_val
p4tfgftt

p4tfgftt3#

您可以使用最小/最大子查询。例如:

SELECT mn.id, (mx.maxdate - mn.mindate) as "duration",
FROM (SELECT id, max(date) as mindate FROM table GROUP BY id) mn
JOIN (SELECT id, min(date) as maxdate FROM table GROUP BY id) mx ON
   mx.id=mn.id

如果您在将工期转换为小时数时需要帮助,请告诉我。

pftdvrlh

pftdvrlh4#

你可以使用lead()/lag()window functions来访问下一行/上一行的数据。你可以进一步subtract timestamps来给予一个interval并提取所需的部分。

select id, floor( extract('day' from diff)*24 + extract('hour' from diff) ) "Time Difference: Hours" 
  from (select id, date_ts - lag(date_ts) over (partition by id order by date_ts) diff
          from example
       ) hd
  where diff is not null
  order by id;

注意事项:

所显示的预期结果不正确。结果分别为-1和-24。
DATE是一个非常糟糕的列名选择。它既是Postgres数据类型(最多导致混淆),又是SQL标准保留字。

相关问题