dポイントプレゼントキャンペーン実施中!

連番のMin, Maxを取得したい

下記のデータが格納されたテーブルで、
部署コードのまとまりごとに、連番のMin, Maxを取得したいと
考えています。

SQLで、期待する結果を取得したいのですが、
なかなかよい案がなく、困っております。
何かよいアイデアがあれば、ご教授頂きたいと思い、質問致しました。

対象DBは、
SQLServer2008 Standard Editionです。


検索するテーブル
RENBAN      BUSYO_CD
----------------------------------------
1          AAA
2          AAA
3          AAA
4          AAA
11          BBB
12          BBB
13          BBB
21          AAA
22          AAA
23          AAA
24          AAA
----------------------------------------

期待する結果
BUSYO_CD   RENBAN_MIN   RENBAN_MAX
--------------------------------------------------------------
AAA       1         4
BBB       11         13
AAA       21         24
--------------------------------------------------------------

※データは、あらかじめ連番(昇順)でソートされています
※連番は、部署コードが同じ間は、続き番号となっていますが、
 部署コードが変わると、続き番号にならない可能性があります。
※同じ部署コードのまとまりが、複数回出てくることがあります。
 (上記例でいえば、連番1~4のAAAと、21~24のAAAは同じ部署コードです)


よろしくお願い致します。

A 回答 (2件)

SELECT BUSYO_CD,MIN(RENBAN), MAX(RENBAN) FROM (


SELECT RENBAN,BUSYO_CD,
ISNULL( (SELECT MAX(RENBAN)
FROM @BUSYO AS S2
WHERE S2.RENBAN < S1.RENBAN
AND S2.BUSYO_CD <> S1.BUSYO_CD),0) AS grp from @BUSYO as S1
) TT GROUP BY TT.grp,BUSYO_CD
ORDER BY TT.grp
    • good
    • 0

RENBAN が INTEGER で主キーもしくは UNIQUE NOT NULL とすれば、下記の様なSQLで出来るかと。


(テーブル名は仮に「BUSYO」としました)

--------------------------------
SELECT B1.BUSYO_CD, B1.RENBAN AS RENBAN_MIN, B2.RENBAN AS RENBAN_MAX
FROM BUSYO B1, BUSYO B2
WHERE
NOT EXISTS (
SELECT 'x'
FROM BUSYO B3
WHERE
B1.BUSYO_CD = B3.BUSYO_CD AND
B3.RENBAN = B1.RENBAN - 1
) AND
NOT EXISTS (
SELECT 'x'
FROM BUSYO B3
WHERE
B2.BUSYO_CD = B3.BUSYO_CD AND
B3.RENBAN = B2.RENBAN + 1
) AND
B1.BUSYO_CD = B2.BUSYO_CD AND
B1.RENBAN <= B2.RENBAN AND
(
SELECT COUNT(*)
FROM BUSYO B3
WHERE
B1.BUSYO_CD = B3.BUSYO_CD AND
B3.RENBAN BETWEEN B1.RENBAN AND B2.RENBAN
) = B2.RENBAN - B1.RENBAN + 1
ORDER BY RENBAN_MIN;
--------------------------------

WHERE句は下記の様な意味になります。
・最初のNOT EXIST句はB1が同一部署の連番の先頭で有る条件
・2番目のNOT EXIST句はB2が同一部署の連番の最後で有る条件
・最後のSELECT COUNT(*)はB1 と B2 の間に同一部署だけが抜けがなく詰まっているかの条件

参考URL:http://codezine.jp/article/detail/1076?p=2
    • good
    • 0
この回答へのお礼

想定していた動きになりました。
ありがとうございます。

お礼日時:2010/09/20 19:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!