Кто съел больше яблок, чем бананов? - PullRequest
1 голос
/ 05 апреля 2020

Для приведенных ниже образцов данных, пожалуйста, помогите мне найти человека, который съел больше яблок, чем бананов? введите описание изображения здесь

Как, например, на прикрепленном изображении данных, Джон и Рита съели больше яблок, чем бананов. Я написал запрос для того же, но с внутренним запросом. Я думал об альтернативном оптимальном решении.

WITH DATA AS (
    SELECT 'Jhon' name, 'Banana' FRUIT, SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jhon' name, 'Banana' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jhon' name, 'Apple' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jhon' name, 'Apple' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jhon' name, 'Apple' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Rita' name, 'Apple' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jack' name, 'Apple' FRUIT,  SYSDATE eatingTime FROM dual UNION ALL
    SELECT 'Jhon' name, 'Banana' FRUIT,  SYSDATE eatingTime FROM dual
)
SELECT name FROM DATA p
WHERE 
(SELECT count(*) FROM DATA b WHERE b.FRUIT= 'Banana' AND b.name = p.name) < 
(SELECT count(*) FROM DATA a WHERE a.FRUIT= 'Apple' AND a.name = p.name)

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Вы можете использовать агрегирование и фильтрацию с предложением having:

select name
from data
group by name
having 
    sum(case when fruit = 'Apple' then 1 else 0 end) 
        > sum(case when fruit = 'Banana' then 1 else 0 end)
0 голосов
/ 05 апреля 2020

Да, как говорит GMB выше, вы можете использовать агрегацию + наличие. Другой способ сделать то же самое будет:

select name
from data d1
group by name
having 
    (select count(fruit) from data d2 where d1.name = d2.name and fruit = 'apple')
        > (select count(fruit) from data d2 where d1.name = d2.name and fruit = 'banana');
...