【问题标题】:Obtain first timestamp over a window function获取窗口函数上的第一个时间戳
【发布时间】:2016-07-26 22:59:11
【问题描述】:

我有一张桌子,上面有 person_idtimestampname。我正在尝试编写一个查询来获取一个人在给定日期(在给定时区)的第一个时间戳。当然,我尝试使用 FIRST_VALUE 并在一天中进行分区,但不确定为什么它不起作用。

SELECT first_value("timestamp") OVER w,
  date_trunc('day', "timestamp" AT TIME ZONE 'US/Central')
FROM analytics_analyticsevent as ae
WHERE person_id=3
GROUP BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central')
WINDOW w as (PARTITION BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central'))

这给了我错误:

ERROR:  column "ae.timestamp" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2: SELECT first_value("timestamp") OVER w,
                           ^

有什么想法吗?

【问题讨论】:

  • 必须在group by中添加first_value("timestamp")

标签: sql postgresql window-functions


【解决方案1】:

看起来像经典的top-n-per-group。通常人们使用ROW_NUMBER,像这样:

SELECT
    "timestamp"
    ,dt
FROM
    (
        SELECT
            "timestamp"
            ,date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') AS dt
            ,ROW_NUMBER() OVER 
                (PARTITION BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') 
                ORDER BY "timestamp") AS rn
        FROM analytics_analyticsevent as ae
        WHERE person_id=3
    ) AS T
WHERE
    T.rn = 1;

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2019-09-10
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2021-08-27
    • 2021-11-21
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多