【问题标题】:Select MIN MAX together alters behaviour of query选择 MIN MAX 一起改变查询的行为
【发布时间】:2020-11-01 12:28:38
【问题描述】:

我有一个包含以下列的 SQLite 表:

  • 时间戳
  • 身份证
  • 价值

我想编写一个查询 - 对于每个 id - 列出具有该时间戳值的最新时间戳,以及每个 id 的最大值。

为此,我编写了以下按预期工作的查询。

SELECT timestamp, MAX(value) as  max, id, value from (
    SELECT * from temperatures order by timestamp DESC
) GROUP BY ID;

当我现在还想计算最小值时,我改变了查询:

SELECT timestamp, MAX(value) as  max, MIN(value) as min, id, value from (
    SELECT * from temperatures order by timestamp DESC
) GROUP BY ID;

现在的问题是时间戳不再是最新的时间戳了。这是为什么呢?

【问题讨论】:

  • 您说您的第一个查询按预期工作,但此查询不返回具有最新时间戳的行的value。它返回具有最大值的行的timestamp

标签: sql database sqlite


【解决方案1】:

您的查询格式不正确。 SELECT 列表与GROUP BY 不兼容。所以,SQLite 所做的是定制处理。 . .是的,查询确实通过添加另一列来改变含义。

我建议您使用窗口函数编写查询:

SELECT id, MIN(timestamp), MAX(timestamp),
       MIN(CASE WHEN timestamp_asc = 1 THEN value END) as temp_at_min,
       MIN(CASE WHEN timestamp_desc = 1 THEN value END) as temp_at_max
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp ASC) as seqnum_asc,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp ASC) as seqnum_desc
      FROM temperatures t
     ) t
GROUP BY ID;

这是标准 SQL,应该始终如一地做你想做的事。

【讨论】:

  • 谢谢。我认为这为我指明了正确的方向。我想我可以使用以下查询:
  • SELECT id, timestamp, value, MIN(value), MAX(value) FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) as seqnum_asc, ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp DESC) as seqnum_desc FROM temperature t ) t GROUP BY ID;
  • 看来你并没有真正理解所说的话。如果 id 是主键,则没有任何点分组。如果它不是主键/比时间戳和值更唯一,那么如果数据库甚至接受它,单独按它进行分组将产生不可预测的结果
【解决方案2】:

您可以使用 MIN()、MAX() 和 FIRST_VALUE() 窗口函数来实现:

SELECT DISTINCT id,
  MIN(timestamp) OVER (PARTITION BY id) min_timestamp,
  MAX(timestamp) OVER (PARTITION BY id) max_timestamp,
  FIRST_VALUE(value) OVER (PARTITION BY id ORDER BY timestamp) min,
  FIRST_VALUE(value) OVER (PARTITION BY id ORDER BY timestamp DESC) max  
FROM temperatures

不需要聚合,窗口函数就够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2017-11-05
    • 2014-12-31
    • 2016-11-24
    • 2013-09-25
    • 2018-01-24
    相关资源
    最近更新 更多