急勾配の判定
Posted feedbacks - SQL
SQL Server 2008 で確認しました。 SQL で関数というと、ストアドファンクションとかになると思うんですけど、入力に対して出力がありさえすれば関数と言うことで、SELECT オンリーで書いてみました。
肝心のロジック部分は、もっといいやり方はあると思います。 3段階SELECTがネストしてるんで、効率は・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | WITH
Input(i, n) AS (
SELECT 1, 100
UNION ALL
SELECT 2, 50
UNION ALL
SELECT 3, 10
)
, HeavySlopes(col) AS (
SELECT
1
FROM
Input P
WHERE
EXISTS(
SELECT * FROM Input C
WHERE P.i < C.i AND P.n > (SELECT SUM(GC.n) FROM Input GC WHERE P.i < GC.i)
)
)
, IsHeavySlope(result) AS (
SELECT
CASE (SELECT COUNT(*) FROM Input)
WHEN COUNT(*) + 1 THEN 1
ELSE 0
END
FROM
HeavySlopes
)
SELECT * FROM IsHeavySlope
|


nobsun
#8891()
Rating1/1=1.00
有限の長さの数列で,各要素の値が,その要素の後ろにある残りの列に含まれるすべての要素の和よりも大きい列を「急勾配の列」ということにします(空列の和は0とします).
任意の長さ(ただし有限の長さの)数列を与えられたとき,それが「急勾配の列」であるかどうかを判定する述語関数を定義してください.
必須ではありませんが,効率についてコメントがあれば面白いかもしれませんね.
[ reply ]