Найти лучшие n результатов разных групп из разных таблиц - PullRequest
0 голосов
/ 24 апреля 2019

Я заблудился в логике работы оконных функций с вложенными запросами.У меня есть две таблицы, которые я объединяю, и мне нужно каким-то образом получить первые три результата по строкам, которые соответствуют определенным критериям.

Я пробовал несколько интенсивных вложений, но теряюсь в том, как этовсе работает.Я видел другие подобные вопросы, но не так много, где вам сначала нужно объединить две таблицы ... и я не уверен, где мне нужно поместить это, скажем, в оконную функцию.

Итак, у вас естьчто-то вроде:

    select name, age, income, location
    from namebank join income_stuff where namebank.name = incomestuff.name


   name | age | income | location
    bob    23    40000    ny
   susan   18    25000    mi
   marty   12     400     ny 
   brent   26    45000    ny
   carl    18    26000    mi
   lana    56    4000     ny   
   raina   30    50000    mi

, что хорошо, но тогда мне нужно

   name | age | income | location
   brent   26    45000    ny
    bob    23    40000    ny
   lana    56    4000     ny 
   raina   30    50000    mi
   carl    18    26000    mi
   susan   18    25000    mi

Так организовано по местоположению с убывающим доходом, но только первые три по местоположению.

1 Ответ

0 голосов
/ 24 апреля 2019

Для этого вам нужно использовать групповые операторы. Чтобы уменьшить сложность, я принял ваш запрос в виде таблицы «testdata» (вы можете создать представление с вашим запросом, чтобы имитировать это) и сформулировал следующий запрос здесь

подход, используемый здесь, ранжирует каждую строку по группе по доходу. Вы можете раскомментировать часть Count (), чтобы увидеть, что произошло в приведенной выше ссылке.

Итак, общий сложный запрос без какого-либо представления или промежуточных таблиц будет выглядеть примерно так:

SELECT testdata.name, testdata.income, testdata.age, testdata.location
FROM 
(select name, age, income, location
    from namebank join income_stuff where namebank.name = incomestuff.name)
AS testdata
LEFT JOIN 
(select name, age, income, location
    from namebank join income_stuff where namebank.name = incomestuff.name) 
AS lesser 
ON testdata.location = lesser.location AND testdata.income < lesser.income
GROUP BY testdata.location, testdata.name, testdata.age, testdata.income
HAVING COUNT(lesser.income) < 3
ORDER BY testdata.location DESC, testdata.income DESC

Edit: Это sqlfiddle , предполагающий возможную конфигурацию таблиц namebank иcome_stuff.

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