在对上一篇文章(Tuning Rows-to-Cols Query)的回答中,我学会了如何更有效地构建一个允许按日期过滤的行到cols查询。但是,我现在需要更进一步。
以下查询的架构如下:
SAMPLE (1-to-many) TEST (1-to-many) RESULT (1-to-MANY)
每个样本都有一个或多个测试,每个测试都有一个或多个结果。
问题:如何更有效地重写此视图,仍允许通过“Date Sampled?”进行快速过滤。
关注:MAX(tst.created_on)
的点数应为test_id
(设置1)的唯一测试集,而不是test_id
的唯一结果集(第2集):
set 1: {1, 2, 76, 77, 135, 136} set 2: {1, 1, 2, 2, 76, 76, 77, 77, 135, 135, 136, 136}
CREATE OR REPLACE VIEW V_TITRATION_SAMPLES as
SELECT sam.sampled_on "Date Sampled",
MAX(CASE WHEN res.result_tmpl_id = 4 THEN result END) "titrator",
MAX(CASE WHEN res.result_tmpl_id = 3 THEN result END) "factor",
MAX(tst.created_on) "Last Test Creation"
FROM lims.sample sam
JOIN lims.test tst ON sam.sample_id = tst.sample_id
JOIN lims.result res ON tst.test_id = res.test_id
WHERE sam.sample_tmpl_id = 4
GROUP BY sample_id, sam.sampled_on
在GROUP BY之前:
SAMPLE COLUMNS | TEST COLUMNS | RESULT COLUMNS
id tmp sampled_on | *id tmp created_on | *id tmp result
1 4 09-20 21:50 | 1 7 09-20 22:20 | 1 1 5
1 4 09-20 21:50 | 1 7 09-20 22:20 | 2 3 2.1
1 4 09-20 21:50 | 2 9 09-20 22:23 | 3 4 6
1 4 09-20 21:50 | 2 9 09-20 22:23 | 4 6 123
25 4 09-21 08:26 | 76 7 09-21 08:53 | 96 1 4
25 4 09-21 08:26 | 76 7 09-21 08:53 | 97 3 1.6
25 4 09-21 08:26 | 77 9 09-21 08:52 | 98 4 4
25 4 09-21 08:26 | 77 9 09-21 08:52 | 99 6 103
102 4 09-21 09:54 | 135 7 09-21 10:34 | 185 1 1
102 4 09-21 09:54 | 135 7 09-21 10:34 | 186 3 1.8
102 4 09-21 09:54 | 136 9 09-21 10:05 | 187 4 5
102 4 09-21 09:54 | 136 9 09-21 10:05 | 188 6 110
* Shortened TABLE_id and TABLE_template_id to id and tmp,
respectively to keep this data grid narrow.
结果:
"Date Sampled" titrator factor "Last Test Creation"
09-20 21:50 6 2.1 09-20 22:23
09-21 08:26 4 1.6 09-21 08:53
09-21 09:54 5 1.8 09-21 10:34
答案 0 :(得分:0)
试一试:
WITH titrate AS (
SELECT r.test_id,
MAX(r.result) 'titrator'
FROM LIMS.RESULT r
WHERE r.result_tmpl_id = 4
GROUP BY r.test_id),
factor AS (
SELECT r.test_id,
MAX(r.result) 'factor'
FROM LIMS.RESULT r
WHERE r.result_tmpl_id = 3
GROUP BY r.test_id),
created AS (
SELECT t.sample_id,
MAX(t.created_on) 'created'
FROM LIMS.TEST t
GROUP BY t.sample_id)
SELECT s.sampled_on,
ti.titrator,
f.factor,
t.created
FROM LIMS.SAMPLE s
JOIN created t ON t.sample_id = s.sample_id
LEFT JOIN titrate ti ON ti.test_id = t.test_id
LEFT JOIN factor f ON f.test_id = t.test_id
我使用子查询因子更改了CASE语句 - 可能没有必要使用LEFT JOIN。
关键部分是LIMS.TEST表的内联视图/子查询因子,您希望获得created_on
的最大sample_id
日期 - 将其与查询的其余部分分开为您提供更多控制权,以便从该表中特别返回您想要的内容。
使用内联视图的等效替代方案 - 它们将执行相同的操作,只是从9i开始支持子查询因子:
SELECT s.sampled_on,
ti.titrator,
f.factor,
t.created
FROM LIMS.SAMPLE s
JOIN (SELECT t.sample_id,
MAX(t.created_on) 'created'
FROM LIMS.TEST t
GROUP BY t.sample_id) t ON t.sample_id = s.sample_id
LEFT JOIN (SELECT r.test_id,
MAX(r.result) 'titrator'
FROM LIMS.RESULT r
WHERE r.result_tmpl_id = 4
GROUP BY r.test_id) ti ON ti.test_id = t.test_id
LEFT JOIN (SELECT r.test_id,
MAX(r.result) 'factor'
FROM LIMS.RESULT r
WHERE r.result_tmpl_id = 3
GROUP BY r.test_id) f ON f.test_id = t.test_id