Группировать по, иметь и упорядочивать в выбранном утверждении

У меня есть таблица 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_dateS, когда есть два или более в 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);
Другие вопросы по тегам