【问题标题】:Group weekly over several years (postgresql)几年内每周分组(postgresql)
【发布时间】:2016-09-27 23:31:15
【问题描述】:

此查询每周正确分组,但排序奇怪:

SELECT    date_part('week' ,date), SUM(qty)
FROM      hr
WHERE     date between '2016-01-01' and '2016-01-31'
GROUP BY  date_part('week', date)
ORDER BY  1

这个查询的结果是:

应该是这样的:

如何确定一周属于哪一年?

欢迎任何提示或线索。

TIA,

【问题讨论】:

    标签: sql postgresql date postgresql-9.1 datepart


    【解决方案1】:

    使用to_char() 将年周格式化为单个可排序值:

    SELECT to_char(date '2016-01-01', 'iyyy-iw'), SUM(qty)
    FROM hr
    WHERE date between '2016-01-01' and '2016-01-31'
    GROUP BY to_char(date '2016-01-01', 'iyyy-iw')
    ORDER BY 1
    

    格式掩码 iyyyiw 使用您似乎期望的 ISO week numbering(例如,将 2015-53 分配给 2016-01-01)。如果您不希望这样,则需要切换到 yyyyww

    【讨论】:

    • 正确!将 GROUP BY 更改为 'iyyy-iw' 并按预期工作。谢谢!
    【解决方案2】:

    只需将年份与弱者联系起来:

    SELECT    concat(date_part('year' ,date),date_part('week' ,date)), SUM(qty)
    FROM      hr
    WHERE     date between '2016-01-01' and '2016-01-31'
    GROUP BY  concat(date_part('year' ,date),date_part('week' ,date))
    ORDER BY  1
    

    编辑:您可以尝试将第一列选择替换为:

    concat(date_part('year' ,date),
           CASE WHEN date_part('week' ,date) < 10 THEN '0' ELSE '' END,
           date_part('week' ,date)) 
    

    【讨论】:

    • 在正确的轨道上!但是排序顺序仍然错误,因为缺少“0”。 20161 在 201553 之前。有什么提示吗?
    • @sibert 编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多