2

これは私の最初の投稿です。私は小切手を扱っています。これは Oracle 11g データベースにあります。

 WITH cheques AS (
    SELECT 1 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 2 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 3 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 4 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 5 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 6 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 7 ch_no,'C' ch_status FROM dual UNION ALL
    SELECT 8 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 9 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 10 ch_no,'C' ch_status FROM dual UNION ALL
    SELECT 11 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 12 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 13 ch_no,'X' ch_status FROM dual UNION ALL
    SELECT 14 ch_no,'X' ch_status FROM dual UNION ALL
    SELECT 15 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 16 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 17 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 18 ch_no,'I' ch_status FROM dual UNION ALL
    SELECT 19 ch_no,'I' ch_status FROM dual UNION ALL
    SELECT 20 ch_no,'U' ch_status FROM dual
 )

私はこの方法でそれらを取得したい:

Status  Min Max
U   1   2
U   5   6
U   8   9
U   11  12
U   16  17
U   20  20
C   7   7
C   10  10
T   3   4
T   15  15
X   13  14
I   18  19

したがって、Reporting Services 2008 では、次のように表示できます。

U       C       T       X       I   
Min Max Min Max Min Max Min Max Min Max
1   2   7   7   3   4   13  14  18  19
5   6   10  10  15  15              
8   9                               
11  12                              
16  17                              
20  20      

ここでの問題は、これを取得する方法、ステータスに基づいて各チェックの最小値と最大値を取得する方法です。検索しましたが、何も見つかりませんでした。

私の英語でごめんなさい。

ありがとう!

4

1 に答える 1

4

これは単純な問題ではなく、いくつかの手順が必要です。

  1. lagの各連続ブロックの開始時に「フラグ」を設定するために使用ch_noします。ch_status
  2. (デフォルトウィンドウを に変更する)sumとともに分析として使用して、隣接する各ブロックに一意の識別子を付与しますorder byunbounded preceeding
  3. 最後に、通常を使用して各ブロックの&group byを計算しますminmax

クエリ:

WITH cheques AS (
    SELECT 1 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 2 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 3 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 4 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 5 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 6 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 7 ch_no,'C' ch_status FROM dual UNION ALL
    SELECT 8 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 9 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 10 ch_no,'C' ch_status FROM dual UNION ALL
    SELECT 11 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 12 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 13 ch_no,'X' ch_status FROM dual UNION ALL
    SELECT 14 ch_no,'X' ch_status FROM dual UNION ALL
    SELECT 15 ch_no,'T' ch_status FROM dual UNION ALL
    SELECT 16 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 17 ch_no,'U' ch_status FROM dual UNION ALL
    SELECT 18 ch_no,'I' ch_status FROM dual UNION ALL
    SELECT 19 ch_no,'I' ch_status FROM dual UNION ALL
    SELECT 20 ch_no,'U' ch_status FROM dual
 )
select ch_status, min(ch_no), max(ch_no)
from( select ch_no, ch_status, sum(changed_flag) over (order by ch_no) as grp
      from( select ch_no, ch_status, 
                   decode(ch_status,lag(ch_status) over(order by ch_no),0,1) 
                     as changed_flag
            from cheques ) )
group by ch_status, grp
order by ch_status, min(ch_no)

結果

| CH_STATUS | MIN(CH_NO) | MAX(CH_NO) |
---------------------------------------
|         C |          7 |          7 |
|         C |         10 |         10 |
|         I |         18 |         19 |
|         T |          3 |          4 |
|         T |         15 |         15 |
|         U |          1 |          2 |
|         U |          5 |          6 |
|         U |          8 |          9 |
|         U |         11 |         12 |
|         U |         16 |         17 |
|         U |         20 |         20 |
|         X |         13 |         14 |

SQLフィドルはこちら

于 2012-12-14T18:08:42.853 に答える