2015-09-10 4 views
3

У меня есть данные в формате ниже:Как оценивать несколько столбцов?

vendor metric1 metric2 metric3 metric4 metric5 metric6 metric7 
a  69  11  53  94  50  45  39 
b  54  80  3  63  23  24  57 
c  59  41  100  10  53  6  94 
d  92  92  1  44  49  84  55 
e  86  89  66  79  27  22  67 

Предположим, что эти показатели влияют на производительность поставщика, и я должен выяснить, какие 3 метрики влияют больше всего. например, для поставщика «a» Мне нужны имена metric4, metric1, metric3 в этом порядке, поскольку эти 3 имеют максимальные значения

Заранее спасибо.

+0

На самом деле это не так, в вопросе PHP снова ранжирование используется несколько раз, но в отдельных столбцах отдельно. Мой вопрос другой. Пожалуйста, прочитайте описание. –

+0

Вы используете Вертикальный или MySQL? Пожалуйста, отметьте соответствующим образом. –

+0

Я использую оба. логика для любого из них будет работать для меня –

ответ

1

Используйте профсоюзы для нормализации данных, то КТР ранжировать их по производителям:

WITH cte 
AS (
    SELECT vendor, value, ROW_NUMBER() OVER (
      PARTITION BY vendor ORDER BY value DESC 
    ) AS rank 
    FROM (
     SELECT vendor, 1 AS metric, metric1 AS value FROM mytable UNION ALL 
     SELECT vendor, 2 AS metric, metric2 AS value FROM mytable UNION ALL 
     SELECT vendor, 3 AS metric, metric3 AS value FROM mytable UNION ALL 
     SELECT vendor, 4 AS metric, metric4 AS value FROM mytable UNION ALL 
     SELECT vendor, 5 AS metric, metric5 AS value FROM mytable UNION ALL 
     SELECT vendor, 6 AS metric, metric6 AS value FROM mytable UNION ALL 
     SELECT vendor, 7 AS metric, metric7 AS value FROM mytable 
    ) AS DerivedByUnion 
) 
SELECT vendor, value, rank 
FROM cte 
WHERE rank <= 3 
ORDER BY NAME, rank ; 
+0

Стреляй. Я полагаю, вы не можете использовать CTE в MYSQL. –

+0

Нет 'CTE' no' ROW_NUMBER' в 'MySQL'. – Praveen

+2

Вопрос отмечен Vertica, который поддерживает обе эти конструкции. –

1

В Vertica, самый простой способ будет в UNPIVOT данных, а затем использовать row_number() и, возможно, повторно совокупный :

select vendor, 
     max(case when seqnum = 1 then which end) as topmetric, 
     max(case when seqnum = 2 then which end) as secondmetric, 
     max(case when seqnum = 3 then which end) as thirdmetric 
from (select vendor, which, 
      row_number() over (partition by vendor order by metric desc) as seqnum 
     from ((select vendor, 'metric1' as which, metric1 as metric from t) union all 
      (select vendor, 'metric2' as which, metric2 from t) union all 
      (select vendor, 'metric3' as which, metric3 from t) union all 
      (select vendor, 'metric4' as which, metric4 from t) union all 
      (select vendor, 'metric5' as which, metric5 from t) union all 
      (select vendor, 'metric6' as which, metric6 from t) union all 
      (select vendor, 'metric7' as which, metric7 from t) 
      ) v 
    ) v 
group by vendor; 

А массовое заявление case - это еще один подход. Но он подвержен ошибкам, сложным, а затем еще более сложным, если значения не отличаются или, возможно, NULL.

+0

На ваш взгляд, каково было бы правильное поведение в случае более трех показателей, имеющих одинаковое значение? – UltraCommit

+0

@UltraCommit. , , Вы должны направить этот вопрос на ОП. –

+0

в случае одинаковых значений любой ранг будет работать, row_number служит цели. Спасибо за помощь. –

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