2013-10-01 2 views
0

У меня есть структура таблицы, как указано ниже, и то, что я хотел бы сделать, это получить три верхние записи с самым высоким значением для каждого кода компании.Ограничение вывода конкретного столбца sql hana

Я искал googled, и я не мог найти лучшего способа, надеюсь, вы, ребята, можете мне помочь.

Кстати, я пытаюсь это сделать в MySQL и SAP HANA. Но я надеюсь, что могу захватить «структуру», если запрос для HANA, если я могу получить помощь только для MySQL

Спасибо большое!

Вот таблица:

http://pastebin.com/xgzCgpKL

+0

Я имел в виду, что могу захватить структуру запроса HANA - как прокси из запроса MySQL, если я не получаю много помощи HANA, так как это понятно новое –

ответ

1

В 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 тоже

+0

Это потрясающе! Спасибо!! –

Смежные вопросы