例如,在excel上,我可以简单地编写一个公式来从所选数据集中的另一个单元格中减去一个单元格,而我基本上在PostgreSQL上做同样的事情。
我有一个数据集,提供了过去28个月中消费者的活动模式。数据包含时间戳记,记录消费者在何时何地,但不包含他在每个位置或活动上花费的时间。我已经尝试使用Age函数,但是由于我没有显示消费者离开位置的时间的列,因此我无法执行以下操作:
SELECT AGE(ended_at,virtual_time)
WHERE consumer_id = '93da'
FROM public.consumer
以下代码为我提供了消费者的活动模式和virtual_time。但是我不知道如何添加另一列来计算每项活动花费的时间。
SELECT activity, virtual_time
FROM public.consumer
WHERE consumer_id = '93da'
GROUP BY 1,2
ORDER BY 2;
我试图通过某种方式使用时间戳记录来计算花费在每个活动上的时间,创建一个新列,该列减去时间戳记号。 2由时间戳1。
例如,将要执行的操作:
Virtual_Time Activity Time_Spent
1) 16/09/2017 17:52:06 Gym 00:34:11
2) 16/09/2017 18:26:17 Whole Foods 00:05:22
3)...
花费的时间=时间戳2(16/09/2017 17:52:06
)减去时间戳1(16/09/2017 18:26:17
)。反之亦然。
是否有可能做我想做的事情?
@GMB:
您提供的代码针对前8条记录返回了此结果:
Virtual_Time Activity Time_Spent
1) 2017-09-16 17:52:06 Marks & Spencer 00:00:00
2) 2017-09-16 17:52:06 Marks & Spencer [NULL]
3) 2017-09-16 18:26:17 Whole Foods 00:00:00
4) 2017-09-16 18:26:17 Whole Foods 00:34:11
5) 2017-09-16 18:26:19 Whole Foods 00:00:00
6) 2017-09-16 18:26:19 Whole Foods 00:00:02
7) 2017-09-16 18:26:20 Whole Foods 00:00:00
8) 2017-09-16 18:26:20 Whole Foods 00:00:01
不确定为什么会有NULL值,这几乎与第no行类似。 4计算的时间戳号。时间戳编号减去4。 2.但是其余的都不对。而且有很多重复项显示(例如第3和4行,第5和6行)。
非常感谢您的帮助。请让我知道您的想法。
答案 0 :(得分:0)
似乎您需要window function LAG()
(从Postgres 8.4开始可用):
SELECT
virtual_time,
activity,
AGE(
virtual_time,
LAG(virtual_time) OVER(PARTITION BY consumer_id ORDER BY virtual_time)
) Time_Spent
FROM public.consumer
WHERE consumer_id = '93da'
GROUP BY virtual_time, activity, consumer_id
ORDER BY virtual_time;
LAG()
使您可以访问给定排序标准的分区(即一组记录)中的当前第N条记录(默认为:第一条记录)。在这里,我们按客户划分,按虚拟时间划分订单。 GROUP BY
子句消除了原始数据中的重复项。
此 DB Fiddle demo 和您的8条示例数据记录返回:
| virtual_time | activity | time_spent |
| ------------------------ | ------------- | --------------------------- |
| 2017-09-16T17:52:06.000Z | Marks&Spencer | |
| 2017-09-16T18:26:17.000Z | WholeFoods | {"minutes":34,"seconds":11} |
| 2017-09-16T18:26:19.000Z | WholeFoods | {"seconds":2} |
| 2017-09-16T18:26:20.000Z | WholeFoods | {"seconds":1} |
注意:第一条记录上没有时间,因为它没有与之比较的先前记录。