SQL Расчетный столбец на основе предложения OVER PARTITION BY - PullRequest
0 голосов
/ 27 марта 2020

У меня есть представление с номером строки на основе PARTITION BY в некоторых столбцах. NOWBER NOWBER начинается с 0 и увеличивается для каждой записи на основе входных данных ssis из различных файлов; для каждого файла с уникальным сочетанием имени файла и даты будут номера строк от 0 до n.

Теперь мне нужно создайте новый столбец, который выполняет вычисление значения, используя номер строки.

RowNumber Value Filename FileDate  
0           500   datax   20200301  
1           200   datax   20200301  
2           100   datax   20200301  
0           600   datax   20200302  
1           200   datax   20200302  
2           200   datax   20200302  
3           100   datax   20200302  
4           200   datax   20200302  
0           700   datay   20200303  
1           500   datay   20200303 

Я хочу новый столбец, который делит значения из каждого RowNumber n на значение в RowNumber 0 для его уникального раздел

NEWVALUE = (Value @ RowNumber N / Value at RowNumber 0)

RowNumber Value  NEWVALUE          Filename FileDate  
0           500   NULL             datax   20200301  
1           200   0.400            datax   20200301  
2           100   0.200            datax   20200301  
0           600   NULL             datax   20200302  
1           200   0.333            datax   20200302  
2           200   0.333            datax   20200302  
3           100   0.167            datax   20200302  
4           300   0.500            datax   20200302  
0           700   NULL             datay   20200303  
1           500   0.714            datay   20200303  

Кто-нибудь знает, как это сделать

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Как и другие предлагали ROWNUM = 0 эквивалент FIRST_VALUE

Сложный бит добавляет ноль для NEWVALUE вместо 1, вам придется прибегнуть к подзапросу.

SELECT 
RowNumber,Value,CASE WHEN RowNumber=0 THEN NULL else NEWVALUE end as NEWVALUE, FileName,FileDate
FROM (
  select ROW_NUMBER() OVER (PArtition BY FileDate ORDER BY Value DESC) -1 as RowNumber,
  Value,
  Value * 1.0 / FIRST_VALUE(Value) OVER (PArtition BY FileDate ORDER BY Value DESC) as NEWVALUE
  ,FileName
  ,FileDate
  from Data
  ) t

Вот sqlfiddle, если вы хотите поиграть с ним http://sqlfiddle.com/#! 18 / 2bdca4 / 1

0 голосов
/ 27 марта 2020

Один метод использует условное агрегирование:

select ( value * 1.0 /
         max(case when rownumber = 0 then value end) over (partition by filename, filedate)
         value
       ) as ratio

Я предполагаю, что группы разбиения основаны на filename и filegroup.

Или используйте first_value():

select ( value * 1.0 /
         first_value(value) over (partition by filename, filedate order by rownumber)
         value
       ) as ratio

Чтобы поместить любой из них в представление, вам понадобится подзапрос.

Если упорядочение основано на максимальном значении, вы можете использовать аналогичные логики c (и обойтись без подзапроса):

select ( value * 1.0 /
         max(value) over (partition by filename, filedate)  * 1.0
         value
       ) as ratio
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...