В MySQL вы можете сделать
Чтобы получить ровно три записи в каждой группу (компании) независимо от того, галстуков имитирующих ROW_NUMBER()
аналитической функции. Записи с одинаковым значением получают одинаковый ранг.
SELECT company, plant, value
FROM
(
SELECT company, plant, value, @n := IF(@g = company, @n + 1, 1) rnum, @g := company
FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL) i
ORDER BY company, value DESC, plant
) q
WHERE rnum <= 3;
Выход:
| COMPANY | PLANT | VALUE |
|---------|-------|-------|
| 1 | C | 5 |
| 1 | B | 4 |
| 1 | A | 3 |
| 2 | G | 6 |
| 2 | C | 5 |
| 2 | D | 3 |
| 3 | E | 8 |
| 3 | A | 7 |
| 3 | B | 3 |
Получить все записи в каждую группу, которые имеют ранг от 1 до 3 эмуляции DENSE_RANK()
аналитической функции
SELECT company, plant, value
FROM
(
SELECT company, plant, value, @n := IF(@g = company, IF(@v = value, @n, @n + 1), 1) rnum, @g := company, @v := value
FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL, @v := NULL) i
ORDER BY company, value DESC, plant
) q
WHERE rnum <= 3;
Выход:
| COMPANY | PLANT | VALUE |
|---------|-------|-------|
| 1 | C | 5 |
| 1 | B | 4 |
| 1 | A | 3 |
| 1 | E | 3 |
| 1 | G | 3 |
| 2 | G | 6 |
| 2 | C | 5 |
| 2 | D | 3 |
| 3 | E | 8 |
| 3 | A | 7 |
| 3 | B | 3 |
| 3 | G | 3 |
Здесьявляется SQLFiddle демо
UPDATE: Теперь это выглядит как HANA supports analytic functions поэтому запросы будут выглядеть
SELECT company, plant, value
FROM
(
SELECT company, plant, value,
ROW_NUMBER() OVER (PARTITION BY company ORDER BY value DESC) rnum
FROM table1
)
WHERE rnum <= 3;
SELECT company, plant, value
FROM
(
SELECT company, plant, value,
DENSE_RANK() OVER (PARTITION BY company ORDER BY value DESC) rank
FROM table1
)
WHERE rank <= 3;
Вот это SQLFiddle демо Это для Oracle, но я считаю, что это будет работа для HANA тоже
Я имел в виду, что могу захватить структуру запроса HANA - как прокси из запроса MySQL, если я не получаю много помощи HANA, так как это понятно новое –