【问题标题】:SQL group by, not sure what it's calledSQL group by,不知道叫什么
【发布时间】:2013-02-06 15:45:40
【问题描述】:

首先,我确定这个问题的答案就在某个地方,但我只是不知道这个特定问题被称为什么来搜索它。

我有一个这样的日志表:

编号 |关键 |价值 |时间戳 ====================================== 1 |一个 |苹果| 高分辨率照片| CLIPARTO 2013-02-05 01:01:01.0001 2 |乙 |蝙蝠 | 2013-02-05 01:01:01.0002 3 |一个 |苹果| 高分辨率照片| CLIPARTO 2013-02-05 01:01:01.0003 4 |乙 |蝙蝠 | 2013-02-05 01:01:01.0004 5 |一个 |苹果| 高分辨率照片| CLIPARTO 2013-02-05 01:01:01.0005 6 |乙 |蝙蝠 | 2013-02-05 01:01:01.0006

我想做这样的查询:

按时间戳顺序从日志组中选择键、值、时间戳

我希望查询返回以下内容:

编号 |关键 |价值 |时间戳 ====================================== 5 |一个 |苹果| 高分辨率照片| CLIPARTO 2013-02-05 01:01:01.0005 6 |乙 |蝙蝠 | 2013-02-05 01:01:01.0006

但它告诉我我应该将时间戳放在违背目的的组中。任何帮助将不胜感激。

顺便说一句,我正在使用 PostgreSQL。

【问题讨论】:

  • 你能把你想看到的输出显示出来吗,你的问题对我来说并不完全清楚
  • 那么你想要返回什么时间戳。查看键 A:d 你想要 .0001、.0003 还是 .0005?,你需要对时间戳执行聚合,然后是 min、max、avg
  • 这取决于你想要做什么。因为每个key 组有多个不同的timestamps,所以希望在排序/过滤之前对集合进行分组(它通常与聚合一起使用)。如果您想要所有时间戳,那么您需要ORDER BY key ASC timestamp ASC。如果您只喜欢每个键的最小/最大(聚合函数)timestamp,那么现有答案之一将起作用。
  • 当然可以。我想查看最后更新的键值。所以在这种情况下 id 5 和 6

标签: sql postgresql group-by greatest-n-per-group


【解决方案1】:

因为您没有在至少某些字段上使用Aggregate 函数,请尝试

SELECT key, value, MAX(timestamp) AS max_timestamp
FROM   log 
GROUP  BY key, value
ORDER  BY max_timestamp DESC

【讨论】:

  • 订单不是也必须达到最大值吗?
  • @xQbert 我已经在我编辑的答案中使用了别名。 :D 但使用 timestamp 也可以。
  • 这实际上不起作用。如果 'value' 有不同的值,它将全部显示出来
  • 如果您可以提供具有所需结果的样本记录,那就更好了。我真的无法想象你的记录是什么样子的
  • 通常是这样,因为您已按键和值对它们进行分组
【解决方案2】:

也许您正在寻找最后一个时间戳?比如:

select
    key, 
    value, 
    max(timestamp) t
from 
    log 
group by 
    key,
    value
order by 
    t desc

【讨论】:

    【解决方案3】:

    原始帖子要求查看 id 字段,其他答案似乎忽略了这一点,并假设键和值具有 1:1 映射(不是愚蠢的假设)。

    从日志中获取每个键的最新时间戳的行:

    with latestLog as (
        select  key, max(timestamp) latestTimestamp
        from    logTable
        group by key)
    select  l.*
    from    log l join latestLog ll on l.key = ll.key and l.timestamp = ll.latestTimestamp
    

    【讨论】:

    • 这个成功了!我在其他查询中获得了具有不同值的行。非常感谢。
    猜你喜欢
    • 2012-01-18
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多