2015-04-08 5 views
0

У меня есть таблица с 3-х столбцов (отсортированных по первым двум):SQL-комплекс группировка «в колонке»

  • буквенных
  • количество (сортированных для каждой буквы)
  • разность между текущим номером и предыдущий номер одного и того же письма

Я хотел бы, чтобы вычислить (с vanlla SQL) в четвертого нового столбца РЕЗУЛЬТАТ группировать эти данные, когда третий столбец (разность NUM между записями contiguos; i.e # 2 -> 4 = 5-1) больше 30, отмечая все записи этого интервала буквенным номером первой записи (например, A1 для # 1, # 2, # 3).

Поскольку разница между номерами контусов имеет смысл только для записей с одной и той же буквой, для первой записи новой буквы значение differnce равно 31 (это означает, что это новая группа, т. Е. # 6).

Вот что я хотел бы получить в результате:

#  Letter  Number  Difference    RESULT (new column) 
1  A   1   1      A1  
2  A   5   4      A1 
3  A   7   2      A1 
4  A   40   33      A40  (*) 
5  A   43   3      A40  
6  B   1   31      B1  (*) 
7  B   25   24      B1 
8  B   27   2      B1 
9  B   70   43      B70  (*) 
10 B   75   5      B70 

Теперь я могу найти только «Breaking значения» (*) с этим запросом, где они получают значение 1:

select letter 
     ,number 
     ,cast(difference/30 as int) break 
from table 
where cast(difference/30 as int) = 1 

Несмотря на то, что я могу найти эти нарушения, я не могу закончить свою задачу.

Может ли кто-нибудь помочь мне найти способ получить столбец RESULT?

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

FF

+0

Какие СУБД вы используете? Postgres? Oracle? –

+0

Я использую Spark Sql (https://spark.apache.org/docs/latest/sql-programming-guide.html), поэтому мне нужен «самый стандартный» SQL, поскольку большинство конструкций «третьей стороны» недоступен. –

ответ

0

после некоторых упражнений и немного помощи от моего друга, я нашел возможное решение моей SQL prolblem.

Единственным требованием для решения является то, что моя первая запись должна иметь значение 31 в поле «Разница» (так как мне нужно «перерывы», когда разница> 30, чем предыдущая запись).

Вот запрос, чтобы получить столбец РЕЗУЛЬТАТ мне нужно:

select alls.letter 
     ,alls.number 
     ,ints.letter||ints.number as result 
    from competition.lag alls 
     ,(select letter 
       ,number 
       ,difference 
       ,result 
      from (select letter 
         ,number 
         ,difference 
         ,case when difference>30 then 1 else 2 end as result 
        from competition.lag 
       ) temp 
     where result = 1 
     ) ints 
where ints.letter=alls.letter 
    and alls.number>=ints.number 
    and alls.number-30<=ints.number 
0

Как я понимаю, вы должны построить столбец последнего результата. Вы можете использовать CONCAT, чтобы сделать это:

SELECT letter 
      ,number 
      ,concat(letter, cast(difference/30 as int)) result 
    FROM table 
    HAVING result = 'A1' 
+0

Я не уверен, что ваш код мог бы работать: 1) нет функции агрегации (для группы) 2) в любом случае вы могли получить только 3 записи с (*) (те, которые я назвал значения разрыва). Мне нужен «полный» столбец, подобный названию Результат –

+0

ваше второе предложение не учитывает тот факт, что каждая запись в интервале ДОЛЖНА иметь «ссылку» на первую часть этого интервала. Например, первые 3 записи в моем примере ДОЛЖНЫ иметь ТОЛЬКО значение для результата столбца –

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