2015-07-20 1 views
0

Я использую SAP HANA, поэтому есть несколько частей языка SQL, которые нельзя использовать (таблица cte, несколько ключевых слов ...). Я использую запрос, который дает мне результаты, связанные с двумя баллами, строки сортируются в соответствии с первой колонкой оценки, а затем во второй столбец. У меня есть много строк, которые имеют небольшую разницу для первого балла и большую разницу для второго балла, поэтому я хотел бы заказать запросы в соответствии со вторым счетом , но только тогда, когда разница между строкой и следующей строкой не превышает порогового значения. Счет 2 может быть пустым.SQL-запрос в зависимости от нескольких столбцов в соответствии с порогом

На данный момент мой код выглядит следующим образом:

select 
     "name", 
     "score1", 
     "score2", 
     LEAD("score1", 1) over (order by "score1" desc, "score2" desc) as "nextscore1" 
from 
     //myrequest generating results 
group by 
     "name", 
     "score1", 
     "score2" 
order by 
     case when ("nextscore1" IS NOT NULL) AND ("score1" - "nextscore1" < 0,1) then "score2" else "score1" END DESC, 
     case when ("nextscore1" IS NOT NULL) AND ("score1" - "nextscore1" < 0,1) then "score1" else "score2" END DESC 

Он всегда выводится результаты меня, отсортированный по одной, а затем другому столбцу, но не смешанных родов я бы ожидать. Спасибо за помощь.

+0

@GordonLinoff HANA - правильный тег. Это не одна из бывших технологий Sybase. –

+1

ORDER не работает по линии. Он работает для всего набора строк, сгенерированных таким образом, ваше условие будет согласовано только один раз. Поэтому я рекомендую вам добавить эти case-выражения в ваш оператор select, а затем упорядочить по этим новым столбцам. –

+0

Спасибо за ваше объяснение, так как мне нужен только порядок, а не оценка значений, Я нашел обходное значение округления значений score1, чтобы собрать их вместе, а затем заказать по счету1, score2 – user2233777

ответ

0

Не знаю, где вы пошли не так здесь, но для меня это работает:

создать столбец таблицу оценку (имя VARCHAR (10), score1 десятичных (10,4), score2 десятичные (10,4))

insert into scores values ('v1', 1, NULL); 
insert into scores values ('v2', 1.5, 2.2); 
insert into scores values ('v3', 1.51, 2.4); 
insert into scores values ('v4', 1.6, 2.1); 
insert into scores values ('v5', 1.4, 2.78); 
insert into scores values ('v6', -1.2, -2.1); 
insert into scores values ('v7', -1.1, 2.1); 
insert into scores values ('v8', 1, 2); 


select name, score1, score2, nextscore1, 
     case 
      when ((nextscore1 IS NOT NULL) AND (score1 - nextscore1 < 0.1)) 
      then score2 
      else score1 
     end score_sort1, 
     case when (nextscore1 IS NOT NULL) AND (score1 - nextscore1 < 0.1) 
      then score1 
      else score2 
     end score_sort2 
from 
    (select 
      name, 
      score1, 
      score2, 
      LEAD(score1, 1) over (order by score1 desc, score2 desc) as  nextscore1 
    from 
     scores 
    group by 
      name, 
      score1, 
      score2) 
ORDER BY 
     case 
      when ((nextscore1 IS NOT NULL) AND (score1 - nextscore1 < 0.1)) 
      then score2 
      else score1 
     end , 
     case when (nextscore1 IS NOT NULL) AND (score1 - nextscore1 < 0.1) 
      then score1 
      else score2 
     end ; 

Для иллюстрации я также помещаю выражения case в список выбора.

NAME SCORE1 SCORE2 NEXTSCORE1 SCORE_SORT1 SCORE_SORT2 
v6  -1.2000 -2.1000 ?   -1.2000  -2.1000  
v7  -1.1000 2.1000 -1.2000  -1.1000  2.1000  
v1  1.0000 ?  -1.1000  1.0000  ?   
v5  1.4000 2.7800 1.0000  1.4000  2.7800  
v2  1.5000 2.2000 1.4000  1.5000  2.2000  
v8  1.0000 2.0000 1.0000  2.0000  1.0000  << small diff of score1 and nextscore1 => score2 is used for SCORE_SORT1 
v4  1.6000 2.1000 1.5100  2.1000  1.6000  << small diff of score1 and nextscore1 => score2 is used for SCORE_SORT1 
v3  1.5100 2.4000 1.5000  2.4000  1.5100  << small diff of score1 and nextscore1 => score2 is used for SCORE_SORT1