望ましさの異なるさまざまなサンプルでテストが実行するデータの一部を含むテーブルがあり(P1はS1よりも優れており、S3よりも優れています。S2よりも優れています)、これらのテストのいずれかを繰り返すことができます。テストが失敗した場合、誰かがそれをやり直す必要があります。
クエリで、最良のサンプル(P1> S1> S3> S2)と、繰り返されるデータ(元のデータではない)のみを表示したいと思います。
次のクエリは機能しますが、ご覧のとおり、かなり長く複雑です。私はまだSQLのジュニアですが、より短い/より良いクエリで同じことをどのように達成できますか?
私はより良いSQLを学ぼうとしているので、常にこれらのタイプの質問をする必要はないので、クエリがよりうまく機能する理由の説明は非常に役立ちます!
DECLARE @TempTable TABLE (Sample_ID varchar(10), TestRepeat int, TestResult varchar(1))
-- In the end, ONLY the samples with Y should be displayed
INSERT INTO @TempTable VALUES('61-0001-P1', 0, 'R') -- 1 Y
INSERT INTO @TempTable VALUES('61-0002-P1', 0, 'R') -- 2 Y
INSERT INTO @TempTable VALUES('61-0003-S1', 0, 'S') -- 3 Y
INSERT INTO @TempTable VALUES('61-0004-S1', 0, 'R') -- 4 Y
INSERT INTO @TempTable VALUES('61-0005-P1', 0, 'I') -- 5
INSERT INTO @TempTable VALUES('61-0005-P1', 1, 'S') -- 6 Y
INSERT INTO @TempTable VALUES('61-0006-P1', 0, 'S') -- 7 Y
INSERT INTO @TempTable VALUES('61-0006-S3', 0, 'R') -- 8
INSERT INTO @TempTable VALUES('61-0007-P1', 0, 'S') -- 9 Y
INSERT INTO @TempTable VALUES('61-0008-S3', 0, 'I') -- 10
INSERT INTO @TempTable VALUES('61-0008-S3', 1, 'R') -- 11 Y
INSERT INTO @TempTable VALUES('61-0009-P1', 0, 'R') -- 12 Y
INSERT INTO @TempTable VALUES('61-0009-S1', 0, 'S') -- 13
INSERT INTO @TempTable VALUES('61-0010-P1', 0, 'S') -- 14 Y
INSERT INTO @TempTable VALUES('61-0011-S3', 0, 'S') -- 15 Y
DECLARE @TempTable1 TABLE (Subject_ID varchar(7), Sample_ID varchar(10), SampleOrder int, TestRepeat int, TestResult varchar(1))
INSERT @TempTable1
SELECT LEFT(Sample_ID,7) AS Subject_ID,
Sample_ID,
SampleOrder =
CASE
WHEN RIGHT(Sample_ID,2) = 'P1' THEN 4
WHEN RIGHT(Sample_ID,2) = 'S1' THEN 3
WHEN RIGHT(Sample_ID,2) = 'S3' THEN 2
WHEN RIGHT(Sample_ID,2) = 'S2' THEN 1
END,
TestRepeat,
TestResult
FROM @TempTable
ORDER BY Subject_ID, SampleOrder;
--SELECT * FROM @TempTable1;
DECLARE @TempTable2 TABLE (Sample_ID varchar(10), TestRepeat int, TestResult varchar(1))
INSERT @TempTable2 SELECT
tt1.Sample_ID,
tt1.TestRepeat,
tt1.TestResult
FROM @TempTable1 tt1
INNER JOIN (
SELECT Subject_ID, MAX(SampleOrder) AS Max_SampleOrder
FROM @TempTable1
GROUP BY Subject_ID) subQ1
ON (tt1.Subject_ID=subQ1.Subject_ID AND tt1.SampleOrder=subQ1.Max_SampleOrder)
ORDER BY tt1.Sample_ID;
SELECT tt2.Sample_ID,
tt2.TestRepeat,
tt2.TestResult
FROM @TempTable2 tt2
INNER JOIN (
SELECT Sample_ID, MAX(TestRepeat) AS Max_TestRepeat
FROM @TempTable2
GROUP BY Sample_ID) subQ
ON (tt2.Sample_ID = subQ.Sample_ID AND tt2.TestRepeat=subq.Max_TestRepeat)
ORDER BY tt2.Sample_ID, tt2.TestResult;