Максимум сгруппированного параметра SQL-запроса

Допустим, у меня есть два столбца в базе данных, 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, поэтому мне не нужна ни одна из них.


person arik    schedule 17.12.2010    source источник


Ответы (3)


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

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

person Larry Lustig    schedule 17.12.2010

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

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

SELECT * 
FROM table 
WHERE col1 IN 
  (SELECT col1 FROM table WHERE col2 < 5 GROUP BY col1) 
ORDER BY col1
person Mathias E.    schedule 17.12.2010
comment
Примечание: выбор * никогда не является лучшим выбором, за исключением случаев, когда вы не знаете, чего ожидать (поля динамической таблицы, которые не очень распространены...) - person Mathias E.; 17.12.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;

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

person Community    schedule 17.12.2010