重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

データが下記の様にあるとします。
テーブル名=tt
No dat
1 0123
2 0562
3 0444
5 9533
7 8520
9 1111
10 2555
12 7878

Noを4の倍数で区切って、datの2,3文字目の最大(d1)、最小(d2)、1レコード目(d3)、最終レコード(d4)を求めたいです。
 出力データ
No dat nn d1 d2 d3 d4
1 0123
2 0562 → 0 56 12 12 44
3 0444
-------------
5 9533 → 1 53 52 53 52
7 8520
-------------
9 1111
10 2555 → 2 87 11 11 87
12 7878


下記の様にやると最大と最小は求めれましたが、最初と最後のデータの求め方がわかりません。
どなたか分かる方教えて下さい。

SELECT min(sec)as nn ,MAX(dd) as d1,Min(dd) as d2 FROM (
SELECT No/4 as sec,SUBSTRING(dat,2,2) as dd
FROM tt
) as s2 group by sec order by nn

A 回答 (1件)

一時表を使った方がいいと思います。


こんなサブクエリでパフォーマンスが高いかどうかは分かりませんが。

IF OBJECT_ID('tempdb..#SEC_TEMP') IS NOT NULL
DROP TABLE #SEC_TEMP

SELECT
A.SEC
, ROW_NUMBER() OVER(PARTITION BY A.SEC ORDER BY A.SEC) AS SEC_CNT
, A.DD
INTO
#SEC_TEMP
FROM
( SELECT
FLOOR(NO / 4) AS SEC
, SUBSTRING(DAT, 2, 2) AS DD
FROM
TT
) A

SELECT
A.SEC AS NN
, MAX(A.DD) AS D1
, MIN(A.DD) AS D2
, (SELECT B.DD FROM #SEC_TEMP B WHERE B.SEC = A.SEC AND B.SEC_CNT = 1) AS D3
, (SELECT C.DD FROM #SEC_TEMP C WHERE C.SEC = A.SEC AND C.SEC_CNT = (SELECT MAX(D.SEC_CNT) FROM #SEC_TEMP D WHERE D.SEC = C.SEC)) AS D4
FROM
#SEC_TEMP A
GROUP BY
A.SEC
ORDER BY
A.SEC ASC
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にさせていただきます。

お礼日時:2016/12/02 10:43

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

関連するカテゴリからQ&Aを探す