只要每一行都包含一个时间戳和当时文件的大小,并且看起来与您的屏幕截图一样,您应该可以使用LAST_VALUE 或FIRST_VALUE 窗口函数来执行此操作。
类似的东西
WITH latest_sizes AS (
SELECT
bucketname,
keyname,
LAST_VALUE(filesize) OVER (
PARTITION BY bucketname, keyname
ORDER BY lastupdated
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS filesize
FROM s3_events
)
SELECT
bucketname,
keyname,
MAX(filesize) AS filesize
FROM latest_sizes
GROUP BY 1, 2
应该给你最后报告的每个桶和键的大小,如果你想要每个桶的总大小,你可以用
替换最后一部分
SELECT
bucketname,
MAX(filesize) AS total_size
FROM latest_sizes
GROUP BY 1
查询的工作方式如下:latest_sizes 将导致与s3_events 表中每一行的行相关(我正在编一个表的名称,用它代替你的),但不是每个更新的filesize filesize 列将具有最新更新的值。这听起来可能有点奇怪,但是单独尝试查询的这一部分并使用参数,您可能会明白我的意思。
神奇之处在于LAST_VALUE 窗口函数。窗口函数适用于当前行和所有其他行的子集。在这种情况下,我将窗口定义为具有相同bucketname 和keyname 的所有其他行,按lastupdated 排序。这意味着每个对象的最新更新将在窗口的最后一行,LAST_VALUE 为我挑选。我本可以使用FIRST_VALUE 获得第一次更新(或订购DESC)。
如果能够在与窗口函数相同的查询中按 bucketname 和 keyname 进行分组,那就太好了,但我不知道如何让 Redshift 做到这一点。相反,我添加了第二部分来进行分组。我使用MAX 来获取大小,但MIN 也可以,我实际上只需要某行的值,因为它们都具有相同的值。想一想SELECT DISTINCT bucketname, keyname, filesize FROM latest_sizes 应该也可以。