Группировать по, иметь и упорядочивать в выбранном утверждении
У меня есть таблица ABC с 2 из ее столбцов, PIN
а также FROM_DATE
, Я хочу сгруппировать по PIN
имеющий count > 1
а также хочу получить результат на FROM_DATE
колонка. Я старался,
SELECT pin, from_date, COUNT(*) AS repetition
from ABC
GROUP BY pin
HAVING COUNT(*) > 1
ORDER BY from_date;
Вышеприведенное утверждение дает мне 'not a GROUP BY expression'
ошибка. Как поставить все Group by
, having
а также order by
в одном select
заявление?
4 ответа
Если вы хотите только последний from_date
для каждого pin
затем:
SELECT pin,
MAX( from_date ) AS from_date,
COUNT(*) AS repetition
FROM ABC
GROUP BY pin
HAVING COUNT(*) > 1
ORDER BY from_date;
Если вы хотите каждый отдельный from_date
для каждого pin
где есть два или более из тех from_date
тогда:
SELECT pin,
from_date,
COUNT(*) AS repetition
FROM ABC
GROUP BY pin, from_date
HAVING COUNT(*) > 1
ORDER BY from_date;
Если вы хотите, чтобы все from_date
S, когда есть два или более в pin
тогда вы можете использовать аналитическую функцию:
SELECT pin,
from_date
FROM (
SELECT pin,
from_date,
COUNT(*) OVER( PARTITION BY pin ) AS repetition
FROM ABC
)
WHERE repetition > 1
ORDER BY from_date;
У вас есть 2 неагрегированных атрибута в предложении select: pin, from_date
но группируются только по одному из них (pin), следовательно, from_date не является выражением GROUP BY
Рассматривать:
SELECT pin, from_date, COUNT(*) AS repetition
from ABC
GROUP BY pin, from_date
HAVING COUNT(*) > 1
ORDER BY from_date;
Вы не можете использовать столбцы выбора без функции агрегирования и не упоминаются в предложении group by, поэтому вы можете использовать подзапрос для получения нужных значений и присоединения к значениям, не входящим в group by.
select distinct ABC.pin, ABC.from_date, t.repetition
from ABC
inner join (
SELECT pin, COUNT(*) AS repetition
from ABC
GROUP BY pin
HAVING COUNT(*) > 1 ) t on t.pin = ABC.pin
order by ABC.from_date
Пытаться:
SELECT pin, MAX(from_date), COUNT(*) AS repetition
from ABC
GROUP BY pin
HAVING COUNT(*) > 1
ORDER BY MAX(from_date);
Или же
SELECT pin, MIN(from_date), COUNT(*) AS repetition
from ABC
GROUP BY pin
HAVING COUNT(*) > 1
ORDER BY MIN(from_date);