Как отфильтровать данные по количеству, не нажимая дважды на вложенную таблицу / подзапрос? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть следующие данные, которые я хочу отфильтровать, применяя счетчики к столбцу cd (т. Е. Получить все столбцы таким образом, чтобы count (cd)> 3)

Образец данных (полученный подзапросом)

cd  c1  c2  d1
----------------
aa  23  681 4850
aa  23  942 4850
aa  28  944 4881
aa  28  221 4850
bb  46  443 9082
cc  77  171 2831
cc  77  272 2831
dd  18  798 5993
xx  71  166 8755
xx  71  482 3818
xx  71  565 7598
xx  71  603 7246
xx  71  649 4293
xx  71  681 7321
xx  71  250 7453
xx  22  276 3818
xx  22  107 8755
yy  28  143 5802
zz  33  624 3205
zz  33  767 1532
zz  33  372 3205
zz  33  679 3838

Я использую следующий запрос, но я не хочу нажимать test_data, поскольку объем данных в таблице кустов велик.(примечание: здесь test_data извлекается из других подзапросов того же запроса)

SELECT cd, c1, c2, d1 
FROM test_data
WHERE cd IN (SELECT cd FROM test_data group by cd having count(cd) > 3)

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы можете использовать оконную функцию, чтобы получить счетчик для каждой группы cd, но на самом деле не агрегировать, а затем отфильтровать строки, где счетчик меньше 4. Хотя для этого все еще требуется подзапрос, вы не присоединяетесь ни к одной таблице, поэтому это должно быть несколько более производительным.

SELECT 
cd, 
c1, 
c2, 
d1 
FROM (
  SELECT
  cd, 
  c1, 
  c2, 
  d1,
  count(1) OVER (PARTITION BY cd ORDER BY c1 DESC) as cd_count 
  FROM test_data
) test_data_1
WHERE cd_count > 3;
0 голосов
/ 05 июня 2019

используйте функции управления окнами, чтобы получить счетчик cd, а затем отфильтровать данные, используя предложение where, как в запросе ниже

select * from (Выбрать cd, c1, c2, d1, count (cd) OVER (PARTITION BYcd) как cnt ОТ test_data) a, где cnt> 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...