0

次のようなソースデータセットがあります(より明確にするために簡略化されています):

Key  F1  F2
1    X   4
2    X   5
3    Y   6
4    X   9
5    X   7
6    X   8
7    Y   9
8    X   6
9    X   5
10   Y   3

データは Key フィールドでソートされます。ここで、F1 フィールドによって定義されたパーティションに対する F2 フィールドの集計を計算したいと思います。パーティションは最初の X 値で始まり、最初の後続の Y 値で終わります。

したがって、たとえば、上記のように定義されたパーティションに対して MIN() を計算したいと思うかもしれません。結果セットは次のようになります。

rownum MIN(F2)  
1      4  
2      7  
3      3  

私は多くのリソース (私たち自身のイントラネット コミュニティやもちろんスタック オーバーフローを含む) を試しましたが、私の場合は何も見つかりませんでした。通常、パーティショニングは、パーティションの識別に使用できるフィールドでのみ機能します。ここで、パーティションは、特定の順序に対するフィールドの内容の変化によって定義されます。

手続き型のソリューションを作成する必要があるかもしれないことは承知していますが、純粋な SQL でこれを解決したいと考えています。

SQL select ステートメントを使用してこのようなパーティショニングを実現する方法はありますか?

カイに感謝します。

4

2 に答える 2

1

少し短い解決策: http://sqlfiddle.com/#!12/7390d/24

クエリ:

select min(f2)
from t t1
group by (select max(key) 
          from t t2 
          where t2.f1='Y' and 
                t1.key > t2.key) 

結果:

| MIN |
-------
|   4 |
|   7 |
|   3 |

アイデアは、各行の前の「Y」のキーを見つけて、それでグループ化することです。任意の SQL エンジンで動作する必要があります。

于 2013-07-09T09:28:01.837 に答える
0

エンジン、ダイアレクト、またはバージョンを指定しなかったため、SQL Server 2012 を想定しました。

ソリューションを確認するために実行できる例: http://sqlfiddle.com/#!6/f5d38/21

セットに正しいパーティションを作成することで解決します。コードは次のようになります。

WITH groupLimits as
(
SELECT
[Key] AS groupend
,COALESCE(LAG([Key]) OVER (order by [Key]),0)+1 AS groupstart
FROM sourceData
WHERE F1 = 'Y'
)
SELECT
MIN(sourceData.F2)
FROM groupLimits
INNER JOIN sourceData
  ON sourceData.[Key] BETWEEN groupLimits.groupstart and groupLimits.groupend
GROUP BY groupLimits.groupstart
ORDER BY groupLimits.groupstart
于 2013-07-09T09:03:31.453 に答える