- 締切済み
連番のMin, Maxを取得したい
連番の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は同じ部署コードです) よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- bigcat1969
- ベストアンサー率70% (7/10)
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
- root139
- ベストアンサー率60% (488/809)
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 の間に同一部署だけが抜けがなく詰まっているかの条件
お礼
想定していた動きになりました。 ありがとうございます。