簡體   English   中英

Oracle SQL:具有窗口聚合功能的自定義ORDER BY子句

[英]Oracle SQL: Custom ORDER BY clause with a window aggregate function

我正在研究一個Oracle SQL語句,該語句可以執行我需要的一些高級排序。 到目前為止,這是我的聲明:

SELECT TIME, PLACE
FROM TABLENAME
ORDER BY MIN(year) OVER (PARTITION BY PLACE), PLACE, TIME;

在獲得其他問題( Oracle SQL分組/訂購 )的幫助后,我將它們放在一起。 現在我需要把季節混合在一起,但是,現有數據庫中沒有對它們進行數字編號。

所以說我有以下數據

TIME   | PLACE
198410 | somewhere
198320 | work
198431 | somewhere
198232 | home
198322 | work
198211 | home
198422 | somewhere

TIME列的前四位數字是年份,下一位數字是季節(其中2 =夏季,3 =秋季,1 =冬季),最后一位應忽略(出於比較原因)。

上面的查詢將產生以下結果(將地點分組並根據時間對它們進行排序(數字方式)):

TIME   | PLACE
198410 | somewhere
198422 | somewhere
198431 | somewhere
198320 | work
198322 | work
198211 | home
198232 | home

但是,我需要一個查詢,該查詢將考慮奇怪的編碼季節(夏季= 2,秋季= 3,冬季= 1),並產生以下按時間排序的結果:

TIME   | PLACE
198422 | somewhere
198431 | somewhere
198410 | somewhere
198320 | work
198322 | work
198232 | home
198211 | home

我沒有制定這個標准,但是不幸的是我必須使用它。 非常感謝您提供幫助以解決此問題。

您可以使用解碼或case語句來“修正”即時的季節排序。 (您沒有“春天”嗎?)

select time, place
from tablename
order by max(substr(time, 1, 4) || case substr(time, 5, 1)
      when '2' then 1 when '3' then 2 when '1' then 3 end)
    over (partition by place) desc,
  place,
  substr(time, 1, 4) desc,
  case substr(time, 5, 1) when '2' then 1 when '3' then 2 when '1' then 3 end;

您似乎按降序排序年份,而代碼示例沒有這樣做,但這與您想要的輸出匹配:

TIME   PLACE   
------ ---------
198422 somewhere 
198431 somewhere 
198410 somewhere 
198320 work      
198322 work      
198232 home      
198211 home      

SQL小提琴

在重復進行年份提取和調整后的季節計算時,您可能希望在子查詢中處理一次:

select time, place
from (
  select time, place, substr(time, 1, 4) as year,
    case substr(time, 5, 1) when '2' then 1 when '3' then 2 when '1' then 3 end
      as season
  from tablename
)
order by max(year || season) over (partition by place) desc,
  place, year desc, season;

另一個SQL Fiddle

暫無
暫無

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

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