我有一张表x
,就像下面的表格一样:
id | name | observed_value |
1 | a | 100 |
2 | b | 200 |
3 | b | 300 |
4 | a | 150 |
5 | c | 300 |
我想进行查询,以便在结果集中只有一个名称的记录:
(1, a, 100)
(2, b, 200)
(5, c, 300)
如果有多个记录对应一个名称,请在上表中说“a”,我只选择其中一个。
在我目前的实现中,我做了一个这样的查询:
select x.* from x ,
(select distinct name, min(observed_value) as minimum_val
from x group by name) x1
where x.name = x1.name and x.observed_value = x1.observed_value;
但我认为可能有更好的方法,如果您知道,请告诉我,提前谢谢。
修改
我正在使用MySQL而且我的表包含的内容超过了此处显示的三列,所以在我看来,内部查询无法满足我的要求。
答案 0 :(得分:3)
SELECT t.*
FROM (
SELECT DISTINCT name
FROM mytable
) q
JOIN mytable t
ON t.id =
(
SELECT id
FROM mytable ti
WHERE ti.name = q.name
ORDER BY
ti.name, ti.observed_value, ti.id
LIMIT 1
)
在(name, observed_value, id)
上创建一个索引,以使此查询更有效。
答案 1 :(得分:1)
仅使用分组
select id, name, min(observed_value) as minimum_val from x group by name;
答案 2 :(得分:1)
由于您没有指定您使用的DBMS,我将提供几个解决方案:
如果您使用的是具有FIRST()
聚合函数的DBMS,则可以使用:
SELECT
FIRST(id) as id,
name,
FIRST(observed_value) as observed_value
FROM x
GROUP BY name;
如果您使用的是MySQL,则可以将ORDER BY
与LIMIT
结合使用,以获得与FIRST()
聚合函数类似的内容。
SELECT
( SELECT x2.id
FROM x as x2
WHERE x2.name = x.name
ORDER BY observed_value ASC
LIMIT 1
) AS id,
name,
MIN(observed_value) as observed_value
FROM x
GROUP BY name
答案 3 :(得分:0)
您的查询看起来太复杂而无法实现...只是按列名对查询进行分组,并对其余列使用聚合函数。例如
SELECT name, min(id), min(observed_value) FROM x GROUP BY name
(显然,如果您想为每个名称获取其他值,请选择min
以外的聚合函数。)