KDB верхние строки для каждой группы - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу запросить 5 лучших получателей зарплаты из таблицы отдела SQL Как

    SELECT * FROM (
                    SELECT empno, salary, RANK () OVER (PARTITION BY deptno ORDER BY salary DESC) emprank FROM emp ) 
    WHERE emprank <= 3;

Я пытался сделать что-то вроде ..

select from emp where ({x in 3#x};i) fby deptno

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

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Другая альтернатива, которая выполняется быстрее и занимает меньше памяти:

q) select from t where ({til[count x] in 3#idesc x};salary) fby deptno

Если вы хотите, чтобы все сотрудники, которые входят в топ-3 уровня зарплаты, вы можете использовать приведенное ниже решение.

q) select from t where ({x in x 3#idesc x};salary) fby deptno

Если ваша таблица не упорядочена командой deptno, то можно использовать 'xasc / xdesc' для упорядочения вашего результата:

q) `deptno xasc select from t where ({til[count x] in 3#idesc x};salary) fby deptno
0 голосов
/ 22 февраля 2019

Другой вариант:

select 3 sublist salary idesc[salary] by deptno from emp

sublist использовался вместо # для рассмотрения дела, если у отдела менее 3 зарплат.

0 голосов
/ 21 февраля 2019

Где t:

t:([]deptno:where 10 20 8;salary:40000+38?30000;emp:neg[38]?`3)

Вы можете вернуть 3 самых высокодоходных по отделу со следующим

q)select from t where 3>(iasc idesc@;salary)fby deptno
deptno salary emp
-----------------
0      69894  mfm
0      55539  bbb
0      62673  jnd
1      66668  afk
1      67474  kcj
1      69979  kon
2      60561  oco
2      57664  khd
2      58743  dga

Обратите внимание, я использовал таблицу t исключительно в качестве примера таблицы.Дайте мне знать, если таблица, которую вы использовали, значительно отличается от той, что у меня здесь.

...