2015-06-02 3 views
1

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

SELECT partner_id, player_id, currency_id, platform_id 
FROM account 
GROUP BY partner_id, player_id, currency_id, platform_id 
HAVING MAX(date) = date 

Мне нужно, чтобы получить все строки, сгруппированные по тому, что я указал в пункте GROUP BY, имеющем max date. Но я получил ошибку около

ERROR: column "account.date" must appear in 
the GROUP BY clause or be used in an aggregate function 

Я использовал его в функции агрегата. Что не так?

+0

Что случилось с 'где максимум (дата) = date'? Если вы хотите использовать 'have', вам нужно группировать столбец в разделе' having'. – Smutje

+0

Агрегаты @Smutje не разрешены в разделе where – user3663882

+0

Что именно вы хотите выполнить? Вам нужна одна строка для каждой группы (строка с максимальной датой)? Если да, то функции окна (как предложено Damien_The_Unbeliever) - это путь. Если нет, добавьте образец ввода и ожидаемый результат в свой вопрос. –

ответ

5

Вы можете использовать window function назначить номера строк (или ряды, если вы хотите принять привязанные верхние строки):

SELECT * FROM (
    SELECT partner_id, player_id, currency_id, platform_id, 
    ROW_NUMBER() OVER (
     PARTITION BY partner_id, player_id, currency_id, platform_id 
     ORDER BY date desc) as rn 
    FROM account 
) as t 
WHERE t.rn = 1 
+0

Так что это невозможно сделать только с помощью, не так ли? – user3663882

+0

@ пользователь3663882 - нет. Внутри каждого предложения одно и то же выражение столбца должно означать одно и то же. Но в вашем примере вы хотите, чтобы слева от равных значение 'date' в' MAX (date) 'означало« значения даты »для всех строк» ​​и справа от равных «date» до означает «значение даты» для определенной строки ». –

+0

Хорошо, теперь это получилось. Спасибо. – user3663882

0

Try ниже запроса:

SELECT partner_id, player_id, currency_id, platform_id 
FROM account 
GROUP BY date, partner_id, player_id, currency_id, platform_id 
HAVING MAX(date) = date 

Здесь вы забыли добавить дату (имя столбца) в группе по п.

Пожалуйста, дайте мне знать, это работает для вас?

+0

Неверно, группировка по дате не получает результат, в котором я нуждаюсь. – user3663882

+0

@ user3663882 использовать ниже запрос, если у вас есть несколько записей с датой max date: 'code' (SELECT partner_id, player_id, currency_id, platform_id FROM account GROUP BY date, partner_id, player_id, currency_id, platform_id WHERE date = (SELECT MAX (date) FROM account)) –

+0

Уверены ли вы в этом? Поскольку группировка упомянутых coummns дает результат, эквивалентный 'SELECT partner_id, player_id, currency_id, platform_id FROM account'. На самом деле группировка по всем столбцам. – user3663882

Смежные вопросы