【问题标题】:How to use order by before group by in SQLite?如何在 SQLite 中使用 group by 之前的 order by?
【发布时间】:2021-11-03 19:23:50
【问题描述】:

我想合并来自两个数据表的信息,t1t2

t1:

ID TIME_ADD
 1 1620838960308
 2 1620879991077
 3 1620927396290
 

t2:

ID TIME_START    TIME_END      LEVEL
 1 1620837000611 1620840600621 0
 2 1620837000611 1620846000620 1
 3 1620837000611 1620851400622 0
 4 1620837000611 1620879262116 3
 5 1620837000611 1620881062117 2
 6 1620837000611 1620882862117 0
 7 1620923400574 1620923400577 2
 8 1620923400574 1620930600578 1
 ...

因此,我的查询如下:

SELECT t1.*, t2.LEVEL 
FROM t1 
INNER JOIN t2 
ON t2.TIME_START < t1.TIME_ADD AND t2.TIME_END >= t1.TIME_ADD 
WHERE t1.TIME_ADD >= '1620837000611' AND t1.TIME_ADD <= '1620882862117'
ORDER BY t1.TIME_ADD
GROUP BY t1.TIME_ADD

预期结果是

ID TIME_ADD      LEVEL
 1 1620838960308 0
 2 1620879991077 2

但是,上面的查询不起作用,似乎是我错误地使用了ORDER BYGROUP BY。花了很长时间试图找到一种方法,也考虑使用INNER JOINLIMIT,但没有成功。因此,我们将非常感谢您提供的任何支持。

【问题讨论】:

  • GROUP BY 必须写在 ORDER BY 之前。
  • 但是我会得到一个错误的结果
  • 你会得到你想要的结果:dbfiddle.uk/…
  • 嗯,这很奇怪,因为在 android sqlite 查询中它不起作用
  • 第一个是指 t2.ID 最少的那个?

标签: sqlite group-by android-sqlite min having-clause


【解决方案1】:

ORDER BY 子句位于 GROUP BY 子句之后。

如果您希望 t1 的每个不同的 TIME_ADDLEVELt2 的最小 ID 的行的 LEVEL 对应 1 行,您可以使用 HAVING MIN(t2.ID) 来实现,这是一项功能SQLite(假设t2 中没有ID0 值):

SELECT t1.*, t2.LEVEL 
FROM t1 
INNER JOIN t2 
ON t2.TIME_START < t1.TIME_ADD AND t2.TIME_END >= t1.TIME_ADD 
WHERE t1.TIME_ADD >= '1620837000611' AND t1.TIME_ADD <= '1620882862117'
GROUP BY t1.TIME_ADD
HAVING MIN(t2.ID)
ORDER BY t1.TIME_ADD;

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多