MASTER TABLE AND INSERT SCRIPTS
请参阅链接sqlfiddle
CREATE TABLE tbl2 (c_id text ,d_id text, f_id text, s_id text);
INSERT INTO tbl2 values('100000019403','D111','F11','S1');
INSERT INTO tbl2 values('100000019404','D112','F11','S1');
INSERT INTO tbl2 values('100000019405','D113','F11','S1');
INSERT INTO tbl2 values('100000019406','D111','F11','S1');
INSERT INTO tbl2 values('100000019407','D112','F11','S1');
INSERT INTO tbl2 values('100000019408','D121','F12','S1');
INSERT INTO tbl2 values('100000019409','D122','F12','S1');
INSERT INTO tbl2 values('100000019410','D123','F12','S1');
INSERT INTO tbl2 values('100000019411','D123','F12','S1');
INSERT INTO tbl2 values('100000019412','D141','F14','S1');
INSERT INTO tbl2 values('100000019413','D131','F13','S1');
INSERT INTO tbl2 values('100000019414','D142','F14','S1');
INSERT INTO tbl2 values('100000019415','D132','F13','S1');
INSERT INTO tbl2 values('100000019416','D143','F14','S1');
INSERT INTO tbl2 values('100000019417','D133','F13','S1');
INSERT INTO tbl2 values('100000019418','D144','F14','S1');
INSERT INTO tbl2 values('100000019419','D211','F21','S2');
INSERT INTO tbl2 values('100000019420','D212','F21','S2');
INSERT INTO tbl2 values('100000019421','D213','F21','S2');
INSERT INTO tbl2 values('100000019422','D211','F21','S2');
INSERT INTO tbl2 values('100000019423','D212','F21','S2');
INSERT INTO tbl2 values('100000019424','D221','F22','S2');
INSERT INTO tbl2 values('100000019425','D222','F22','S2');
INSERT INTO tbl2 values('100000019426','D223','F22','S2');
INSERT INTO tbl2 values('100000019427','D223','F22','S2');
INSERT INTO tbl2 values('100000019428','D241','F24','S2');
INSERT INTO tbl2 values('100000019429','D231','F23','S2');
INSERT INTO tbl2 values('100000019430','D242','F24','S2');
INSERT INTO tbl2 values('100000019431','D232','F23','S2');
INSERT INTO tbl2 values('100000019432','D243','F24','S2');
INSERT INTO tbl2 values('100000019433','D233','F23','S2');
INSERT INTO tbl2 values('100000019434','D244','F24','S2');
INSERT INTO tbl2 values('100000019435','D311','F31','S3');
INSERT INTO tbl2 values('100000019436','D312','F31','S3');
INSERT INTO tbl2 values('100000019437','D313','F31','S3');
INSERT INTO tbl2 values('100000019438','D311','F31','S3');
INSERT INTO tbl2 values('100000019439','D312','F31','S3');
INSERT INTO tbl2 values('100000019440','D321','F32','S3');
INSERT INTO tbl2 values('100000019441','D322','F32','S3');
INSERT INTO tbl2 values('100000019442','D323','F32','S3');
INSERT INTO tbl2 values('100000019443','D323','F32','S3');
INSERT INTO tbl2 values('100000019444','D341','F34','S3');
INSERT INTO tbl2 values('100000019445','D331','F33','S3');
INSERT INTO tbl2 values('100000019446','D342','F34','S3');
INSERT INTO tbl2 values('100000019447','D332','F33','S3');
INSERT INTO tbl2 values('100000019448','D343','F34','S3');
INSERT INTO tbl2 values('100000019449','D333','F33','S3');
INSERT INTO tbl2 values('100000019450','D344','F34','S3');
INSERT INTO tbl2 values('100000019451','D111','F11','S1');
INSERT INTO tbl2 values('100000019452','D112','F11','S1');
INSERT INTO tbl2 values('100000019453','D113','F11','S1');
INSERT INTO tbl2 values('100000019454','D111','F11','S1');
INSERT INTO tbl2 values('100000019455','D112','F11','S1');
INSERT INTO tbl2 values('100000019456','D121','F12','S1');
INSERT INTO tbl2 values('100000019457','D122','F12','S1');
INSERT INTO tbl2 values('100000019458','D123','F12','S1');
INSERT INTO tbl2 values('100000019459','D123','F12','S1');
INSERT INTO tbl2 values('100000019460','D141','F14','S1');
INSERT INTO tbl2 values('100000019461','D131','F13','S1');
INSERT INTO tbl2 values('100000019462','D142','F14','S1');
INSERT INTO tbl2 values('100000019463','D132','F13','S1');
INSERT INTO tbl2 values('100000019464','D143','F14','S1');
INSERT INTO tbl2 values('100000019465','D133','F13','S1');
INSERT INTO tbl2 values('100000019466','D144','F14','S1');
我们有一个带有资产ID的交易表,它只提供有关失败资产的信息。假设如果更高级别的资产ID失败,则也会填充子级数据,但在获取记录时我们需要忽略子级记录并获得最高级别。
交易数据可用3天,讨论三种不同的情况。 2013-10-10中关于S1资产的情景1失败了,这也给出了需要忽略的儿童记录。
2013-10-11的情景2讨论了F21,F22,F23失败及其子记录。我们需要忽视孩子们。注意资产ID S1没有失败,因此不会出现在方案2的交易表中
2013-10-12的情景3讨论了F33失败及其子女D331,D332,D333。我们只需考虑F33并忽略儿童。考虑D311,D312,D313,D321,D322和D323。
我们总是需要按照startdatetime字段进行分组,因为父记录和子记录对于给定的条目总是具有相同的列值。
请参阅上面的链接,其中还包含事务表和数据
CREATE TABLE tbl1 (startdatetime text, enddatetime text, assetid text);
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'S1');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'F11');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'F12');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'F13');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D111');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D112');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D113');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D121');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D122');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D123');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D131');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D132');
INSERT INTO tbl1 values('2013-10-10 22:10:11', '2013-10-10 22:10:11', 'D133');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'F21');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'F22');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'F23');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D211');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D212');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D213');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D221');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D222');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D223');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D231');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D232');
INSERT INTO tbl1 values('2013-10-11 22:10:11', '2013-10-11 22:12:11', 'D233');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'F33');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D311');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D312');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D313');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D321');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D322');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D323');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D331');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D332');
INSERT INTO tbl1 values('2013-10-12 22:10:11', '2013-10-12 22:16:11', 'D333');
预期输出:
根据交易数据表对受影响的消费者进行计数。
请帮我查看上述情况的c_id记录详情,我会得到点数。
答案 0 :(得分:0)
case1 :存在s_id然后忽略子(f_id)和子(d_id)行
使用CTEs,解决方案可能如下所示:
WITH x AS (
SELECT d_id, f_id
FROM tbl2 t2
JOIN tbl1 t1 ON t1.assetid = t2.s_id
)
SELECT t.*
FROM tbl1 t
LEFT JOIN d ON d.d_id = t.assetid
LEFT JOIN f ON f.f_id = t.assetid
WHERE d.d_id IS NULL
AND f.f_id IS NULL
x
标识d_id
和f_id
将被忽略。d_id
或f_id
上匹配的行。case2 :f_id存在然后忽略父(s_id)和更低(d_id)
WITH x AS (
SELECT d_id, s_id
FROM tbl2 f
JOIN tbl1 t ON t.assetid = f.f_id
)
SELECT t.*
FROM tbl1 t
LEFT JOIN x d ON d.d_id = t.assetid
LEFT JOIN x s ON s.s_id = t.assetid
WHERE d.d_id IS NULL
AND s.s_id IS NULL;
case3 :d_id存在然后忽略父s_id,f_id
你明白了,不是吗?