почему команда group by и count возвращает мне такой результат? - PullRequest
0 голосов
/ 04 марта 2019
speed ram model
500    64   1
500   64    2
500   32    3
900   128   4
600   128   5
700   32    6
700   64    7

select speed,ram from rrr  group by speed,ram having count(speed)>1

результат:

speed  ram
500    64

почему результат такой?но я ожидаю следующий результат:

speed  ram
500    32
500    64
700     32
700     64 

потому что есть три 500, две 700 записи Может кто-нибудь объяснить это?

Ответы [ 4 ]

0 голосов
/ 04 марта 2019
    create table #temp (speed int,ram int,model int)
    insert into #temp values (500  ,  64 ,  1)
    insert into #temp values (500  , 64  ,  2)
    insert into #temp values (500  , 32  ,  3)
    insert into #temp values (900  , 128 ,  4)
    insert into #temp values (600  , 128 ,  5)
    insert into #temp values (700  , 32  ,  6)
    insert into #temp values (700  , 64  ,  7)
    select speed ,(ram) as ram,count(ram) as RamCount from #temp group by  speed ,ram having count(ram)>=1
    order by 1
    drop table #temp

enter image description here

0 голосов
/ 04 марта 2019

group by speed,ram создает следующие группы

speed  ram
------------
500    64   
500    32    
900    128   
600    128   
700    32    
700    64    

count Функция условия having применяется ко всей группе .Таким образом, не имеет значения, пишете ли вы count(speed), count(*) или count(ram).Все они возвращают одно и то же значение.

См. Это демо

Единственная группа с населением больше 1 - 500, 64, следовательно,полученный результат.

Вы можете достичь ожидаемого результата, используя оконную функцию:

SELECT DISTINCT speed, ram
FROM (
   SELECT speed, ram, COUNT(*) OVER (PARTITION BY speed) AS cnt
   FROM mytable) t
WHERE t.cnt > 1

Обратите внимание на предложение PARTITION BY оконной функции: она группируется по speed.

Демо здесь

0 голосов
/ 04 марта 2019

Поскольку вы группируете по скорости и оперативной памяти, поэтому, чтобы быть в одной группе, оба значения должны быть равны.

Результат select speed,ram, count(speed) from rrr group by speed,ram будет

speed ram count
500   64    2
500   32    1
900   128   1
600   128   1
700   32    1
700   64    1

Единственное единственноестрока, имеющая count(speed) > 1 - это строка 500 64

Чтобы получить то, что вы ожидаете, используйте этот запрос:

SELECT Distinct speed, ram
FROM rrr
 INNER JOIN (SELECT speed FROM rrr GROUP BY speed HAVING count(*) > 1) T
 ON T.speed = rrr.speed
0 голосов
/ 04 марта 2019

Вы группируете по оперативной памяти и скорости, эта группа перегруппировывается с одним и тем же атрибутом оперативной памяти И с тем же атрибутом скорости.В вашей модели только строки 1 и 2 в этом случае.Тогда ваше условие HAVING сохраняет только группы с более чем двумя строками, поэтому оно остается только вашей группой со строками 1 и 2.

Я не понимаю, что вы пытаетесь сделать точно, ножелаемый результат больше похож на Select speed, ram from rrr where speed in (Select speed group by speed having count(*) > 1)

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