2017-08-07 57 views
1

我想獲得MIN/MAX房屋編號,這是一件容易的事。在考慮地區時將房屋編號彙總到MIN和MAX

但有一列包含一個地區。

原始數據:

Street Name | House Number | district 
Hauptstr. |   1 | A 
Hauptstr. |   2 | A 
Hauptstr. |   3 | B 
Hauptstr. |   4 | B 
Hauptstr. |   5 | A 

所需的輸出:

Street Name | House number (FROM) | House number (TO) | district 
Hauptstr. |   1   |   2  |  A 
Hauptstr. |   3   |   4  |  B 
Hauptstr. |   5   |   5  |  A 

我的輸出:

Street Name | House number (FROM) | House number (TO) | district 
Hauptstr. |   1   |   5  |  A 
Hauptstr. |   3   |   4  |  B 

我打開想法和建議。我是否需要臨時表來處理地址?

預先感謝您。

+0

什麼數據庫系統? –

+0

最初數據來自MaxDB(SAP)數據庫。我目前正試圖在MySQL數據庫(4.7) – user3433650

+0

@ user3433650中使用建議的「FIRST」和「LAST」-Value,因此您的查詢應該可以在MaxDB中運行,對吧? –

回答

1

您可以使用變量的MySQL做它一組分配到相鄰的街道值的每個行:!

select street, district, min(housenumber), max(housenumber) 
from (select t.*, 
      (@grp := if(@d = district, @grp, 
         if(@d := district, @grp + 1, @grp + 1) 
         ) 
      ) as grp 
     from t cross join 
      (select @d := '', @grp := 0) params 
     order by street, housenumber 
    ) t 
group by grp, street, district; 
0

假設您正在處理SQL的實現支持它們,您可以使用分析功能,如在(未經)

select streetname 
     ,first_value(housenumber) over (order by streetname, housenumber partition by district) as from 
     ,last_value(housenumber) over (order by streetname, housenumber partition by district) as to 
     ,district 
from table 

編輯的行FIRST_VALUELAST_VALUE:該查詢不工作,但事沿着這些線應該。

EDIT2:這裏是一個(有點令人費解)的方式來做到這一點

select * 
from (
    select streetname 
      ,district 
      ,from_num 
      ,coalesce(to_num,lead(to_num,1) over (partition by streetname order by housenumber)) as to_num 
    from (
     select streetname 
       ,housenumber 
       ,district 
       ,case when coalesce(lag(district,1) over (partition by streetname order by housenumber),'') <> district then housenumber end as from_num 
       ,case when coalesce(lead(district,1) over (partition by streetname order by housenumber),'') <> district then housenumber end as to_num 
     from table 
     ) 
    where from_num is not null or to_num is not null 
) 
where from_num is not null 

這在DB2測試。我不知道MaxDB,因此您可能需要修改語法。 至於發生了什麼事的解釋:

  1. 在第一通(最裏面的子查詢),我期待在第一次(即,當先前的小區比當前的不同)和去年(即,當未來地區將與當前不同)按街道名稱和門牌號排序的每個地區組的記錄。如果第一個,那麼我把房子號碼存儲爲'from';如果最後一個,我將它存儲爲'to'
  2. 從那以後,我只選擇每個組的第一個和最後一個記錄(即那些'from'或'to'值填入的那些記錄。 1到每組最多2條記錄對於沒有填入'to'值的每條記錄,我填寫下一條記錄中的記錄
  3. 所有剩下要做的是從這個子結果中選擇只有那些填寫,這兩個值的記錄,瞧
+0

從文檔中看來,MaxDB和MySQL都不支持窗口函數('lead','lag')。雖然你的方法很優雅,但在這裏不起作用。來源:https://help.sap.com/viewer/58c8145174ef49c1b78fae156ce46f62/7.5.6/en-US/44d947dc90234428e10000000a15536​​9.html,https://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems – markusk

+0

@markusk,好吧,太糟糕了。感謝您的高舉。 – user2877959

+0

@ user2877959非常感謝您的意見。可悲的是,正如markusk所說:MaxDB和MySQL都不支持這些功能。瞭解其他數據庫能夠做什麼讓我印象深刻。 – user3433650