2016-06-21 1 views
0

У меня есть таблица с 2 полями, называемыми clc_cs_id,clc_pt_nxt_rv_dt в моей таблице. Я пытаюсь получить счет clc_cs_id с наивысшей датой 2016-06-25 из моего приведенного ниже примера. Я попытался дать max(clc_pt_nxt_rv_dt)='2016-06-25' в состоянии. Но бросая invalid use of group by function ошибки. Примеры данных приведены ниже.Как получить счетчик с самой высокой датой в качестве заданной даты в запросе mysql

clc_cs_id  clc_pt_nxt_rv_dt 
--------- ------------------- 
2    25-06-2016 00:00:00 
2    27-06-2016 00:00:00 
3    17-06-2016 00:00:00 
3    25-06-2016 00:00:00 
3    29-06-2016 00:00:00 
3    29-06-2016 00:00:00 
4    18-06-2016 00:00:00 
4    25-06-2016 00:00:00 
5    25-06-2016 00:00:00 

Из вышесказанного я пытаюсь исключить clc_cs_id 3, потому что самая высокая дата, которая является 29.06.2016. Запрос, который я пробовал, приведен ниже.

select count(clc_cs_id) from clc_case_dtls 
where max(clc_pt_nxt_rv_dt) = date('2016-06-25') 
group by clc_cs_id 

Если кто-нибудь может помочь, это будет очень полезно для меня. Спасибо заранее.

Ожидаемый выход

COUNT(clc_cs_id) 
--------------- 
3 
+0

предикатов в 'WHERE' положение вычисляется, когда ряды * доступа *. Значение агрегированных выражений (например, 'MAX()') недоступно при доступе к строкам. С другой стороны, предложение 'HAVING' оценивается намного позже в обработке запросов, * после того, как * были доступны строки и после операции GROUP BY, и после вычисления агрегатов. Таким образом, в предложении 'HAVING' можно включить условия для агрегатов. Это объясняет, почему MySQL возвращает ошибку. Кроме того, неясно, о чем вы спрашиваете. – spencer7593

+0

Если 'clc_pt_nxt_rv_dt' является символьным типом данных (' CHAR' или 'VARCHAR'), а не' DATETIME' и хранится в формате, как показано в вопросе ... DD-MM-YYYY, тогда «MAX()» будет работать на * string * сравнениях ... например '22-04-2016' * больше *' 20-06-2016'. Если вам нужно найти «максимальные» значения даты, вам необходимо преобразовать строки в типы данных DATE, DATETIME или TIMESTAMP и выполнить MAX в результате этого преобразования. Тип данных MySQL DATETIME специально разработан для обработки значений даты и времени. И это тип данных, который мы используем для столбцов, хранящих значения datetime. Не характер. – spencer7593

ответ

1

Ваш оригинальный запрос не был далеко. Я думаю, что вы хотите использовать HAVING ограничить каждую группу в запросе:

SELECT clc_cs_id, COUNT(clc_cs_id) 
FROM clc_case_dtls 
GROUP BY clc_cs_id 
HAVING MAX(clc_pt_nxt_rv_dt) = STR_TO_DATE('2016-06-25', '%Y-%m-%d') 

я заменил свой date() вызов с STR_TO_DATE().

Если вы хотите, чтобы получить общее количество clc_cs_id значений которых максимальных дата 2016-06-25, то вы можете запросить выше запрос:

SELECT COUNT(*) 
FROM 
(
    SELECT clc_cs_id, COUNT(clc_cs_id) 
    FROM clc_case_dtls 
    GROUP BY clc_cs_id 
    HAVING MAX(clc_pt_nxt_rv_dt) = STR_TO_DATE('2016-06-25', '%Y-%m-%d') 
) t 
+0

Благодарим за быстрый ответ. Но я получаю вывод как COUNT (clc_cs_id) 2 & 1 вместо 3 –

+0

Покажите нам желаемый результат в исходном вопросе. –

+0

@ Tim Biegeleisen: Я дал ожидаемый результат в моем первоначальном вопросе. –