オッズ比の 2x2 テーブルを作成するストアド プロシージャがあります。基本的なオッズ比表は次のようになります。
編集- このクエリは最終的に終了し、2 分後に関数を 32 回呼び出した後、正しい回答が返されました。なぜこれが再帰的に実行されているのかわかりません。アイデアはありますか?
A - only records that satisfy both thing 1 and thing 2 go here
B - only records that satisfy thing 1 (people with thing 2 CANNOT go here)
C - only records that satisfy thing 2 (people with thing 1 CANNOT go here)
D - people with thing 1 OR thing 2 cannot go here
テーブル内のすべてのセルは、人口を表す整数になります。
私はいくつかの新しい構文を学ぼうとしていたので、intersect
andを使用することにしexcept
ました。thing 1
およびthing 2
s 変数を作成したかったので、以下のクエリをストアド プロシージャに入れました。
CREATE PROC Findoddsratio (@diag1 NVARCHAR(5),
@diag2 NVARCHAR(5))
AS
IF Object_id('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp
(
squarenumber CHAR(1),
counts FLOAT
)
INSERT INTO #temp
(squarenumber,
counts)
SELECT *
FROM (
--both +
SELECT 'a' AS squareNumber,
Cast(Count(DISTINCT x.counts)AS FLOAT) AS counts
FROM (SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag1
INTERSECT
SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag2)x
UNION
--only 1+
SELECT 'b',
Count(DISTINCT x.counts)
FROM (SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag1
EXCEPT
SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag2)AS x
UNION
--only 2+
SELECT 'c',
Count(DISTINCT x.counts)
FROM (SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag2
EXCEPT
SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag1)AS x
UNION
--both -
SELECT 'd',
Count(DISTINCT x.counts)
FROM (SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
EXCEPT
SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag2
EXCEPT
SELECT DISTINCT ic.patid AS counts
FROM icdclm AS ic
WHERE ic.icd LIKE @diag1) AS x)y
--i used a pivot table to make the math work out easier
SELECT Round(Cast(( a * d ) / ( b * c ) AS FLOAT), 2) AS OddsRatio
FROM (SELECT [a],
[b],
[c],
[d]
FROM (SELECT [squarenumber],
[counts]
FROM #temp) p
PIVOT ( Sum(counts)
FOR [squarenumber] IN ([a],
[b],
[c],
[d]) ) AS pvt)t
ICDCLM
のような構造を持つテーブルですpatid=int, icd=varchar(5)
には ~ 100 万行ありICDCLM
ます。ストアド プロシージャにせずにこのクエリを実行すると、数秒で実行されます。私がしようとするとexec FindsOddsRation 'thing1%','thing2%'
。実行され実行されますが、何も返されません (> 2 分)。ストアド プロシージャに非常に時間がかかることの違いは何でしょうか? ここでSQL Server 2008 R2 フィドル