为什么这个非聚合的群组有效?

时间:2016-04-23 17:15:51

标签: sql sqlite

知道为什么以下两个查询产生相同的结果?根据我所看到的所有参考文献,第一个甚至不应该工作,但确实如此。显然,如果它不是一个小故障,我更喜欢第一个,因为它是一个更简单,可能更快的查询。

SELECT *,MIN(ts) FROM tbl GROUP BY id;

SELECT *,ts FROM tbl a WHERE rowid IN 
     (SELECT rowid FROM tbl b WHERE a.id = b.id ORDER BY ts LIMIT 1);

以下是一些示例数据:

rowid   id  ts  name
    1   58  10  aaa
    2   58   5  bbb
    3   72   7  ccc

结果预期:

    2   58   5  bbb  5     
    3   72   7  ccc  7

SQLFiddle here...

2 个答案:

答案 0 :(得分:1)

这是有效的,因为一些不支持窗口函数的平台将此构造视为窗口函数 - 在SQL Server,Oracle和db2上你必须编写

 min(ts) over(order by ts)

答案 1 :(得分:1)

自SQLite 3.7.11以来,这保证有效。

至于原因:一些付费客户想要它......