Максимальный сгруппированный параметр SQL-запроса - PullRequest
2 голосов
/ 17 декабря 2010

Допустим, у меня было две колонки в базе данных, col1 и col2. Колонка 2 это время, Колонка 1 что-то. В своем запросе я хочу сделать следующее:

Я хочу SELECT * из моей таблицы и сгруппировать результаты по col1. Однако мне нужны только те записи, в которых для сгруппированного col1 нет значения col2 выше определенного значения. Это означает, что я хочу только те col1-s, для которых col2 не превышает определенного значения. Если, например, у меня было три строки, как показано ниже:

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, поэтому я не хочу ни одного из них.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010
 SELECT col1 FROM table GROUP BY col1 HAVING MAX(col2) <= 4

Поскольку вам требуется только общее значение (col1) из группы, вы можете использовать GROUP BY. Когда вы выполняете запрос GROUP BY (агрегатный), вы можете использовать предложение HAVING, чтобы применить фильтр к набору агрегированных данных.

1 голос
/ 17 декабря 2010
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;

Или я неправильно понял вопрос?

1 голос
/ 17 декабря 2010

Я не пользуюсь, я понял (мой английский не очень хорош).Я думаю, что подзапрос - лучший выбор.

Примечание: этот пример должен работать с mySql ...

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