Mysql 在有限集合中查找最小值
我需要从单列中有限的行数中找到一个最小值。假设我有这个结果表: 现在我需要创建一组>=50且限制为3行的值。像这样:Mysql 在有限集合中查找最小值,mysql,sql,min,sql-limit,Mysql,Sql,Min,Sql Limit,我需要从单列中有限的行数中找到一个最小值。假设我有这个结果表: 现在我需要创建一组>=50且限制为3行的值。像这样: ----------------------------------------- | id | category | class | score | ----------------------------------------- | 1 | contest1 | seven | 55 | | 2 | contest1 |
-----------------------------------------
| id | category | class | score |
-----------------------------------------
| 1 | contest1 | seven | 55 |
| 2 | contest1 | sixth | 78 |
| 10 | contest1 | nine | 51 |
-----------------------------------------
在这个集合中,我必须找到最小值,这实际上非常简单,但前提是我手动为每个类别找到它。此查询非常有效:
SELECT MIN(t1.score)
FROM (
SELECT category, score
FROM results
WHERE category = "contest1" AND score >= 50
ORDER BY score DESC
LIMIT 3
) t1
并给出正确的结果:
-------------------
| MIN(t1.score) |
-------------------
| 51 |
-------------------
但是,我不能为每个类别编写一个自动执行的查询。在一个真实的表格中,有上百个类别和数千个分数值。如何在一组有限的行中找到每个类别的最小值?使用行号获取每个类别的前三行:
select r.*
from (select r.*,
row_number() over (partition by category order by sid) as seqnum
from results r
where score >= 50
) r
where seqnum <= 3;
您没有足够的行来产生影响 但它也使用rwo数字为每个类别获得3个大于50的最小分数
dbfiddle谢谢你的回答。我恐怕这不是我的选择,因为我有MySQL 5.7。@sauromates。为什么您希望至少有三个任意行?为什么不使用总最低分数呢?因为每个类别的总最低分数都是50分,我需要在50到100分之间至少有25%的最高分数。
select r.*
from (select r.*,
row_number() over (partition by category order by sid) as seqnum
from results r
where score >= 50
) r
where seqnum <= 3;
select category, min(score)
from (select r.*,
row_number() over (partition by category order by sid) as seqnum
from results r
where score >= 50
) r
where seqnum <= 3
group by category;
CREATE TABLE results (
`id` INTEGER,
`category` VARCHAR(8),
`class` VARCHAR(6),
`score` INTEGER
);
INSERT INTO results
(`id`, `category`, `class`, `score`)
VALUES
('1', 'contest1', 'seven', '55'),
('2', 'contest1', 'sixth', '78'),
('3', 'contest2', 'seven', '20'),
('4', 'contest1', 'eleven', '21'),
('5', 'contest2', 'eleven', '56'),
('6', 'contest3', 'ten', '66'),
('7', 'contest3', 'ten', '90'),
('8', 'contest3', 'nine', '91'),
('9', 'contest2', 'seven', '30'),
('10', 'contest1', 'nine', '51');
SELECT
`id`, `category`, `class`, `score`
FROM(SELECT
IF(`category` = @cat,@rown := @rown + 1 ,@rown := 1) rownum
,`id`
, @cat := `category` 'category'
, `class`
, `score`
FROM (SELECT * FROM results ORDER By `category`, `score` )r1,(SELECT @rown := 0, @cat := '') t1
WHERE `score` > 50 ) t1
WHERE rownum < 4
id | category | class | score
-: | :------- | :----- | ----:
10 | contest1 | nine | 51
1 | contest1 | seven | 55
2 | contest1 | sixth | 78
5 | contest2 | eleven | 56
6 | contest3 | ten | 66
7 | contest3 | ten | 90
8 | contest3 | nine | 91