0

次の SQL の問題があり、実際にこれを行う最も効率的な方法を探しています。次のテーブルがあるとします。

r|Company - StartPeriod - EndPeriod - NumberOfEmployees - NumberOfMachines ...
1|A - 2014-1-1 - 2014-2-5 - 30 - 1
2|A - 2014-2-6 - 2014-3-7 - 30 - 1
3|A - 2014-3-8 - 2014-4-9 - 31 - 1
4|A - 2014-4-9 - 2014-5-1 - 32 - 1
5|B - 2014-1-2 - 2014-2-1 - 20 - 2
6|B - 2014-2-2 - 2014-3-1 - 20 - 2
7|B - 2014-3-2 - 2014-4-1 - 20 - 2

冗長なデータ量に気付きましたか? これは、企業がときどきサンプリングされるため、期間の長さが実際にはランダムであるためです。

問題は、NumberOfEmployees、NumberOfMachines などの変数が同じで、StartPeriod と Endperiod が異なる場合にのみ、行をマージするにはどうすればよいかということです。もちろん、開始期間を最も早いものに、終了期間を最も遅いものに置き換えたいと思います。

r は単なる指標であり、データベース内の変数ではありません。この場合、1 と 2 はマージされますが、値が異なるため (つまり、従業員数が 30 人ではなく 31 人であるため)、3,4 は保持されます。

私の意見では、これは非常に難しい問題であり、SQL がこれを実行できるかどうかさえわかりません。

結果の出力は次のようになります。

r|Company - StartPeriod - EndPeriod - NumberOfEmployees - NumberOfMachines ...
1|A - 2014-1-1 - 2014-3-7 - 30 - 1
2|A - 2014-3-8 - 2014-4-9 - 31 - 1
3|A - 2014-4-9 - 2014-5-1 - 32 - 1
4|B - 2014-1-2 - 2014-4-1 - 20 - 2

すべてに感謝します!

4

2 に答える 2

1

あなたはただ使うことができるかもしれませんgroup by:

select company, min(startperiod) as startperiod, max(endperiod) as endperiod,
       numberofemployees, numberofmachines . .
from table t
group by company, numberofemployees, numberofmachines;

これで問題が解決しない場合は、質問を編集して、行のマージに必要な追加のロジックに関する詳細情報を提供してください。

于 2015-03-12T15:57:21.870 に答える
0

「島とギャップ」戦略を使用できます。

select r, company, min(startperiod), max(EndPeriod)
     , NumberOfEmployees, NumberOfMachines, ..., grp
from (
    select r, company, startperiod, EndPeriod, ...
         , row_number() over (order by r)
         - row_number() over (partition by company, 
                                           NumberOfEmployees,
                                           NumberOfMachines, ...  
                              order by r) as grp
    from T
)
group by r, company, NumberOfEmployees, NumberOfMachines, ..., grp
于 2015-03-12T16:03:35.303 に答える