2010-12-17 113 views
2

比方说,我在数据库中有两列,分别为col1col2。第2列是时间,第1列是一些东西。在我的查询中,我想要执行以下操作:SQL查询分组参数最大值

我想从我的表中将SELECT *分组,结果为col1。但是,我只希望那些分组col1中没有col2的值高于某个值的条目。这意味着,我只想要那些col2没有超过特定值的col1-s。 如果,例如,我有三排,具体如下:

ROW1: col1 = val1, col2 = 3 
ROW2: col1 = val1, col2 = 5 
ROW3: col1 = val2, col2 = 3 
ROW4: col1 = val2, col2 = 4 

而且我不希望超过4的时候了其中任何一个,那么,作为一个结果,我只会想ROW3或ROW4,这对col1来说是无关紧要的,并且是分组的。但在行1和行2中,按col1的值“val1”进行分组,其中一个col2超过4,因此我不想要其中的任何一个。

回答

2
SELECT col1 FROM table GROUP BY col1 HAVING MAX(col2) <= 4 

因为您只需要组中的公共值(col1),所以可以使用GROUP BY。当您执行GROUP BY(聚合)查询时,可以使用HAVING子句将过滤器应用于聚合数据集。

+0

完美!谢谢。 – arik 2010-12-17 17:48:11

1

我没有用我明白了(我的英文不好)。 我认为子查询是最好的选择。

注:这个例子应该使用MySQL的...

SELECT * 
FROM table 
WHERE col1 IN 
    (SELECT col1 FROM table WHERE col2 < 5 GROUP BY col1) 
ORDER BY col1 
+1

注意:除非您不知道预期会发生什么,否则“select *”绝不是最好的选择(动态表的字段不是很常见......) – 2010-12-17 17:27:11

1
CREATE TABLE x (
    t TIME NOT NULL, 
    v INT NOT NULL); 

INSERT INTO x VALUES 
    ('13:14:00', 24), 
    ('13:14:00', 27), 
    ('13:14:00', 29), 
    ('17:12:00', 14), 
    ('17:12:00', 20), 
    ('17:12:00', 24); 

SELECT t, MAX(v) AS mv FROM x 
    GROUP BY t 
    HAVING mv <= 25; 

还是我误解了问题?