2

我有这个查询:

SELECT apple, banana, update_at FROM 
(
    SELECT DISTINCT ON (apple) *
        FROM table
            WHERE apple IN ('ad', 'sa')

        ORDER BY apple, update_at DESC
) q

此查询的目的是获取具有apple“ad”或“sa”的行,并返回最新更新的行 ( update_at (timestamp))。此查询有效。

我的问题是,我希望update_at查询将显示查询匹配行的时间戳(持续时间)与其前面的行之间的差异,而不是列。

例子:

apple---|banana---|update_at
============================
ad------|VAL------|2017-06-01 12:12:30
ad------|VAL------|2017-06-01 09:00:00
ad------|VAL------|2017-05-31 13:41:00

结果:

apple---|banana---|update_at
============================
ad------|VAL------|**03:12:30**

03:12:30 是持续时间。

希望它足够清楚。

4

1 回答 1

2

您需要为此使用窗口函数:

SELECT apple, 
       banana, 
       update_at, 
       prev_update_at, 
       update_at - prev_update_at as duration
FROM (
   SELECT *, 
          row_number() over (partition by apple order by update_at desc) as rn, 
          lag(update_at) over (partition by apple order by update_at) as prev_update_at
   FROM table
   WHERE apple IN ('ad', 'sa')
) q
where rn = 1;
于 2017-06-01T14:56:23.297 回答