Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按某列SQL进行的移位操作分组_Sql_Greenplum - Fatal编程技术网

按某列SQL进行的移位操作分组

按某列SQL进行的移位操作分组,sql,greenplum,Sql,Greenplum,因此,我在一个包含超过400万行的大表名采购上使用了GreenPlum。以下是此表的一个示例: userId | purchaseTime | timeDiff ------------------------------------------ 17 | 2016-02-01 11:01:02 | 17 | 2016-02-01 13:24:58 | 17 | 2016-02-01 21:12:36 | 67

因此,我在一个包含超过400万行的大表名采购上使用了GreenPlum。以下是此表的一个示例:

userId |        purchaseTime      | timeDiff
------------------------------------------
 17    |   2016-02-01 11:01:02    |
 17    |   2016-02-01 13:24:58    |
 17    |   2016-02-01 21:12:36    |
 67    |   2016-02-01 17:04:49    |
 84    |   2016-02-01 16:13:20    |
 94    |   2016-02-01 05:46:13    |
 94    |   2016-02-01 21:33:19    |

该表按用户ID和purchaseTime排序,以帮助理解我的目标

我的目标是通过包含每个用户当前行和上次购买时间之间的时间差来更新此表

让它看起来像这样:

userId |        purchaseTime      | timeDiff
------------------------------------------
 17    |   2016-02-01 11:01:02    | NULL
 17    |   2016-02-01 13:24:58    | 2:23:56
 17    |   2016-02-01 21:12:36    | 8:12:38
 67    |   2016-02-01 17:04:49    | NULL
 84    |   2016-02-01 16:13:20    | NULL
 94    |   2016-02-01 05:46:13    | NULL
 94    |   2016-02-01 21:33:19    | 16:13:06
从您的一个答案中选择帮助了我。现在我需要执行更新,但在执行以下操作时,更新附近出现语法错误:

WITH tmp_table AS
(
    SELECT userId ,  
       purchaseTime ,
       purchaseTime - LAG(purchaseTime )
       OVER (PARTITION BY userId  ORDER BY purchaseTime) AS timeDiff
    FROM   purchases
)

UPDATE purchases SET timeDiff = tmp_table.timeDiff
FROM tmp_table
WHERE userId   = tmp_table.userId  
AND purchaseTime = tmp_table.purchaseTime;

有人能帮我更新我的桌子吗

您可以使用
lag
窗口功能查找上一个购买日期,只需减去两个:

SELECT userId,  
       purchaseTime,
       purchaseTime - 
        LAG(purchaseTime) OVER 
           (PARTITION BY userId ORDER BY purchaseTime) AS timeDiff
FROM   purchases

因此,根据@mureinik的查询,为了进行更新,您必须执行以下操作:

UPDATE purchases
SET timeDiff = tmp_table.timeDiff
FROM (SELECT userId, purchaseTime ,
       (EXTRACT(epoch FROM purchaseTime - LAG(purchaseTime) OVER 
           (PARTITION BY userId ORDER BY purchaseTime))/60)::integer AS timeDiff
        FROM   purchases) AS tmp_table
WHERE purchases.userId = tmp_table.userId
AND purchases.timeDiff = tmp_table.timeDiff;

在更新中,您将使用
EXTRACT
epoch FROM
语句,以返回间隔中的秒数。如果您想在几分钟内将它们除以60,最后如果您想将其四舍五入,只需将其转换为整数即可

使用Lag函数获得所需的结果。如果要更新整个表,最好创建一个新表。如果你更新整个表的话,磁盘上的大小基本上会增加一倍。谢谢@Mureinik这正是我想要的,但我是GreenPlum的基本用户,你能指导我如何更新我的表吗?