Postgres:计算连续值之间的时间间隔(以秒为单位)

发布于 2025-01-17 06:12:50 字数 657 浏览 0 评论 0原文

我想知道我们如何计算连续日期时间的差异(例如以天或秒为单位),考虑下面的示例表:

time                       value
2020-03-30 00:25:10       10112
2020-04-02 08:04:03       45665
2020-04-10 09:55:56       112
2020-04-10 13:12:00       858
2020-04-28 10:15:59       89965
2020-05-30 22:31:02       12

这是由 ' diff()

0                NaT
1    3 days 07:38:53
2    8 days 01:51:53
3    0 days 03:16:04
4   17 days 21:03:59
5   32 days 12:15:03

换句话说,Postgres相当于pandas' diff()

I was wondering how we can compute the difference of successive date-times (for example in days or seconds), considering the sample table below:

time                       value
2020-03-30 00:25:10       10112
2020-04-02 08:04:03       45665
2020-04-10 09:55:56       112
2020-04-10 13:12:00       858
2020-04-28 10:15:59       89965
2020-05-30 22:31:02       12

Here is a desired result generated by ' diff():

0                NaT
1    3 days 07:38:53
2    8 days 01:51:53
3    0 days 03:16:04
4   17 days 21:03:59
5   32 days 12:15:03

In other words, what is the Postgres equivalent to pandas' diff()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白况 2025-01-24 06:12:50

您可以简单地减去滞后时间戳,然后使用 to_char。例如:

SELECT "time" - LAG("time") OVER (ORDER BY "time") AS diff,
       TO_CHAR("time" - LAG("time") OVER (ORDER BY "time"), 'DD "days" HH24:MI:SS') AS cdiff
FROM data

输出:

diff                                            cdiff
null                                            null
{"days":3,"hours":7,"minutes":38,"seconds":53}  03 days 07:38:53
{"days":8,"hours":1,"minutes":51,"seconds":53}  08 days 01:51:53
{"hours":3,"minutes":16,"seconds":4}            00 days 03:16:04
{"days":17,"hours":21,"minutes":3,"seconds":59} 17 days 21:03:59
{"days":32,"hours":12,"minutes":15,"seconds":3} 32 days 12:15:03

db-fiddle 上的演示

注意 如果您还想要行号,则可以添加一个,因为

ROW_NUMBER() OVER (ORDER BY "time") - 1 AS rownum

您还可以使用 EXTRACT

EXTRACT(EPOCH FROM "time" - LAG("time") OVER (ORDER BY "time")) AS seconds

输出

rownum  diff                                            cdiff               seconds
0       null                                            null                null
1       {"days":3,"hours":7,"minutes":38,"seconds":53}  03 days 07:38:53    286733
2       {"days":8,"hours":1,"minutes":51,"seconds":53}  08 days 01:51:53    697913
3       {"hours":3,"minutes":16,"seconds":4}            00 days 03:16:04    11764
4       {"days":17,"hours":21,"minutes":3,"seconds":59} 17 days 21:03:59    1544639
5       {"days":32,"hours":12,"minutes":15,"seconds":3} 32 days 12:15:03    2808903

db-fiddle 演示

You can simply subtract a lagged timestamp, and then output as an interval or in the format you desire using to_char. For example:

SELECT "time" - LAG("time") OVER (ORDER BY "time") AS diff,
       TO_CHAR("time" - LAG("time") OVER (ORDER BY "time"), 'DD "days" HH24:MI:SS') AS cdiff
FROM data

Output:

diff                                            cdiff
null                                            null
{"days":3,"hours":7,"minutes":38,"seconds":53}  03 days 07:38:53
{"days":8,"hours":1,"minutes":51,"seconds":53}  08 days 01:51:53
{"hours":3,"minutes":16,"seconds":4}            00 days 03:16:04
{"days":17,"hours":21,"minutes":3,"seconds":59} 17 days 21:03:59
{"days":32,"hours":12,"minutes":15,"seconds":3} 32 days 12:15:03

Demo on db-fiddle

Note if you want a row number as well, you can add one as

ROW_NUMBER() OVER (ORDER BY "time") - 1 AS rownum

You can also get the value in seconds using EXTRACT:

EXTRACT(EPOCH FROM "time" - LAG("time") OVER (ORDER BY "time")) AS seconds

Output

rownum  diff                                            cdiff               seconds
0       null                                            null                null
1       {"days":3,"hours":7,"minutes":38,"seconds":53}  03 days 07:38:53    286733
2       {"days":8,"hours":1,"minutes":51,"seconds":53}  08 days 01:51:53    697913
3       {"hours":3,"minutes":16,"seconds":4}            00 days 03:16:04    11764
4       {"days":17,"hours":21,"minutes":3,"seconds":59} 17 days 21:03:59    1544639
5       {"days":32,"hours":12,"minutes":15,"seconds":3} 32 days 12:15:03    2808903

Demo on db-fiddle

走走停停 2025-01-24 06:12:50
SELECT row_number() OVER w - 1,
       time - lag(time) OVER w
FROM tab
WINDOW w AS (ORDER BY time)
ORDER BY time;

row_number 对结果行进行计数,而 lag 则按定义的顺序获取上一行的值。

SELECT row_number() OVER w - 1,
       time - lag(time) OVER w
FROM tab
WINDOW w AS (ORDER BY time)
ORDER BY time;

row_number counts the result rows, and lag gets you the value from the previous row in the defined order.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文