【问题标题】:How to aggregate this simple SQL?如何聚合这个简单的 SQL?
【发布时间】:2020-08-17 10:28:57
【问题描述】:

我有一张这样的桌子:

ID Value Key
0  ValA  0
1  ValB  0
2  ValC  1
4  ValD  0
5  ValE  1

除了表格本身,我还对 Key==1 的第一个 ID 感兴趣。我可以使用以下查询来找到它:

SELECT Key FROM MyTable WHERE Key=1 ORDER BY ID ASC LIMIT 1

现在,我想将查询组合到常规 SELECT 中,这样我就可以一次性获得所有汇总信息。

我的以下尝试失败了,我尝试了:

SELECT 
    ID,
    Value,
    Key,
    (SELECT Key FROM MyTable WHERE Key=1 ORDER BY ID ASC LIMIT 1 AS FirstKeyIs1) 
FROM MyTable

我应该如何重写我的查询?预期的行为应该是FirstKeyIs1 为 2。最终目标是过滤掉在2 之前具有关键属性的 ID。

ID Value Key FirstKeyIs1
0  ValA  0   2
1  ValB  0   2
2  ValC  1   2
4  ValD  0   2
5  ValE  1   2 

【问题讨论】:

  • 我正在使用 MySQL。
  • Key 是 MySQL 中的保留字。也许重新开始。

标签: mysql sql database subquery window-functions


【解决方案1】:

如果你的数据库支持窗口函数,你可以这样做:

select
    t.*,
    min(case when key = 1 then id end) over() firstKeyIs1
from mytable t

否则,您使用子查询的方法是可以的。您只需要将列别名移出子查询 - 大概,您想要返回 id 而不是 key

select
    t.*,
    (select id from mytable where key = 1 order by id limit 1) firstKeyIs1 
from mytable

或者你可以在子查询中使用聚合:

select
    t.*,
    (select min(id) from mytable where key = 1) firstKeyIs1 
from mytable

【讨论】:

  • @HelloWorld:在 MySQL 8.0 中添加了窗口函数,因此第一个查询仅在 MySQL 8.0 中有效。另外两个查询适用于所有版本的 MySQL。
猜你喜欢
  • 1970-01-01
  • 2022-08-13
  • 2020-12-31
  • 2021-08-19
  • 1970-01-01
  • 2012-11-24
  • 2017-02-08
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多