为什么这种父系非聚合的分组方式有效

  • 本文关键字:有效 方式 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...

这保证从SQLite 3.7.11开始有效。

至于为什么:一些付费客户想要它......

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

 min(ts) over(order by ts)

最新更新