【发布时间】:2018-05-12 22:25:00
【问题描述】:
我需要排除一些业务案例来过滤记录。
SQL Fiddle 链接:http://sqlfiddle.com/#!4/a130b/2
首先,我有一个站点表,其中包含站点编号、站点所属区域、进出方向以及运行序列号。
CREATE TABLE stns (stn number, dir varchar2(10), seq number , area varchar2(20));
INSERT INTO stns VALUES (314,'In',1,'Houston');
INSERT INTO stns VALUES (315,'In',2,'Houston');
INSERT INTO stns VALUES (316,'In',3,'Houston');
INSERT INTO stns VALUES (317,'In',4,'Houston');
INSERT INTO stns VALUES (324,'Out',72,'Houston');
INSERT INTO stns VALUES (311,'Out',73,'Houston');
INSERT INTO stns VALUES (312,'Out',74,'Houston');
INSERT INTO stns VALUES (313,'Out',75,'Houston');
INSERT INTO stns VALUES (133,'In',82,'Blacktown');
INSERT INTO stns VALUES (148,'In',83,'Blacktown');
INSERT INTO stns VALUES (136,'In',84,'Blacktown');
INSERT INTO stns VALUES (135,'In',85,'Blacktown');
INSERT INTO stns VALUES (134,'In',86,'Blacktown');
INSERT INTO stns VALUES (127,'Out',1,'Blacktown');
INSERT INTO stns VALUES (126,'Out',2,'Blacktown');
INSERT INTO stns VALUES (125,'Out',3,'Blacktown');
INSERT INTO stns VALUES (124,'Out',4,'Blacktown');
INSERT INTO stns VALUES (176,'Out',12,'Christtown');
INSERT INTO stns VALUES (177,'Out',13,'Christtown');
INSERT INTO stns VALUES (178,'Out',14,'Christtown');
INSERT INTO stns VALUES (179,'Out',15,'Christtown');
INSERT INTO stns VALUES (919,'In',38,'Albian');
INSERT INTO stns VALUES (920,'In',39,'Albian');
INSERT INTO stns VALUES (208,'In',41,'Albian');
INSERT INTO stns VALUES (922,'In',42,'Albian');
接下来,我有操作表,其中包含起点和终点站、营业时间和顾客数量。
-1 表示我们不知道 ostn 或 dstn 在哪里..UNKNOWN
CREATE TABLE DEMO ( dt number, ostn number, ohr number, dstn number , dhr number, patrons number );
INSERT INTO DEMO VALUES (20171101, -1,-1,919,1,4);
INSERT INTO DEMO VALUES (20171101, -1,-1,920,2,3);
INSERT INTO DEMO VALUES (20171101, 208,2,922,2,2);
INSERT INTO DEMO VALUES (20171101, 314,3,316,2,2);
INSERT INTO DEMO VALUES (20171101, 133,1,-1,-1,1);
INSERT INTO DEMO VALUES (20171101, 133,2,134,2,4);
INSERT INTO DEMO VALUES (20171101,1000,1,314,2,3);
INSERT INTO DEMO VALUES (20171101,1000,1,315,2,3);
INSERT INTO DEMO VALUES (20171101,1000,1,315,2,3);
INSERT INTO DEMO VALUES (20171101,-1,-1,177,2,3);
INSERT INTO DEMO VALUES (20171101,178,1,179,2,3);
INSERT INTO DEMO VALUES (20171101,178,1,-1,-1,3);
INSERT INTO DEMO VALUES (20171101,178,1,888,2,3);
INSERT INTO DEMO VALUES (20171101,999,1,11,2,3);
INSERT INTO DEMO VALUES (20171101,998,1,12,2,3);
INSERT INTO DEMO VALUES (20171101,997,1,13,2,3);
INSERT INTO DEMO VALUES (20171101,313,1,777,2,3);
INSERT INTO DEMO VALUES (20171101,313,2,312,4,4);
INSERT INTO DEMO VALUES (20171101,919,1,179,2,3);
INSERT INTO DEMO VALUES (20171101,178,2,208,4,4);
INSERT INTO DEMO VALUES (20171101, 12321,1, 124,1,3);
INSERT INTO DEMO VALUES (20171101, 127,1, 124,1,3);
接下来,我有一个配置表,其中包含了业务案例,其中 flag_ind 指示是否包含案例。 Y 是包含 N 是排除。
create table cnfg ( o_in number, o_out number, d_in number,d_out number,flag_ind char(1));
INSERT INTO CNFG VALUES (1,0,1,0,'Y');
INSERT INTO CNFG VALUES (0,0,1,0,'Y');
INSERT INTO CNFG VALUES (0,0,0,1,'Y');
INSERT INTO CNFG VALUES (1,0,0,1,'N');
INSERT INTO CNFG VALUES (0,1,0,1,'Y');
INSERT INTO CNFG VALUES (1,0,0,0,'Y');
INSERT INTO CNFG VALUES (0,1,1,0,'N');
INSERT INTO CNFG VALUES (0,1,0,0,'Y');
INSERT INTO CNFG VALUES (0,0,0,0,'N');
到此为止,我将转置演示表以找出 o_in、o_out、d_in、d_out 属性。我能够正确地理解逻辑(在这个社区的帮助下)
SELECT dt,
ostn,
ohr,
dstn,
dhr,
patrons,
CASE
WHEN ostn IN (SELECT stn
FROM stns
WHERE dir = 'In')
THEN 1 ELSE 0
END o_in,
CASE
WHEN ostn IN (SELECT stn
FROM stns
WHERE dir = 'Out')
THEN 1 ELSE 0
END o_out,
CASE
WHEN dstn IN (SELECT stn
FROM stns
WHERE dir = 'In')
THEN 1 ELSE 0
END d_in,
CASE
WHEN dstn IN (SELECT stn
FROM stns
WHERE dir = 'Out')
THEN 1 ELSE 0
END d_out
FROM demo;
我可以用 cnfg 加入表格演示并排除那些情况 flag_ind 是 N。现在的问题是有更多的业务案例 确定了从最终结果集中排除的那些需求
- 对于 dir IN ,客户在 Blacktown 上点击并在走廊外点击
- 对于 dir Out,客户在外面的走廊上敲击,然后在 Blacktown 敲击
- 对于 dir IN,客户点击外面的走廊并在休斯顿点击
- 对于 dir OUT,客户在休斯顿点击并在走廊外点击 对于休斯顿案例,我需要检查序列号 并仅排除特定的 stn 详细信息,请查看 查询。
select * FROM demo
WHERE ostn IN
(SELECT stn
FROM stns
WHERE dir='In'
AND area = 'Blacktown')
AND dstn NOT IN (SELECT stn FROM stns); -- Case1
select * FROM demo
WHERE dstn IN
(SELECT stn
FROM stns
WHERE dir='Out'
AND area = 'Blacktown')
AND ostn NOT IN (SELECT stn FROM stns); -- Case2
select * FROM demo
WHERE (dstn IN
(SELECT stn
FROM stns
WHERE dir = 'In'
AND area = 'Houston'
AND seq = 1)
AND ostn NOT IN (SELECT stn FROM stns)); -- Case3
select * from demo
WHERE (ostn IN
(SELECT stn
FROM stns
WHERE dir = 'Out'
AND area = 'Houston'
AND seq = 75)
AND dstn NOT IN (SELECT stn FROM stns)); -- Case4
您能否指导或帮助排除上述情况以及cnfg表中提到的情况。
【问题讨论】: