簡體   English   中英

基於 OVER PARTITION BY 子句的 SQL 計算列

[英]SQL Calculated Column based on OVER PARTITION BY Clause

我有一個基於跨某些列的 PARTITION BY 的 ROW NUMBER 視圖。 ROW NUMBER 從 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  

有人知道怎么做嗎

像其他人建議 ROWNUM = 0 等價於 FIRST_VALUE

棘手的一點是為 NEWVALUE 添加一個 null 而不是 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

一種方法使用條件聚合:

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

我猜分區組基於filenamefilegroup

或者使用first_value()

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

要將其中任何一個放入視圖,您需要一個子查詢。

如果排序基於最大值,那么您可以使用類似的邏輯(並省去子查詢):

select ( value * 1.0 /
         max(value) over (partition by filename, filedate)  * 1.0
         value
       ) as ratio

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM