删除没有事件数据的行
Remove the rows that does not have incident data
我有如图所示的事件数据:
.
我想根据这些条件编写查询:
如果特定月份有基于县、站点和月份的事件数据,则应删除空事件行,如红色所示 "X"
如果没有基于县、地点和日期的事件数据,则应保留空行,如绿色勾号所示
我不会使用函数或存储过程。
您需要 County
、Site
、“站点编号, and
日期(month), and then you want
事件and
优先级”的所有唯一组合的列表,如果它们存在。
这是一道两步题。首先,生成唯一值列表。那是带有 GROUP BY
的内部子查询。
然后执行 LEFT JOIN
回到基础 table,但仅在 Incident
存在的地方。这是 ON
子句中的最后一个 JOIN
条件。
结果集将仅显示 Incident
存在的数据(删除您想要删除的空记录),但将为每个没有任何事件的唯一组合创建一个空记录。 COALESCE
语句只是 window 使结果漂亮的修饰。
数据设置:
DECLARE @t TABLE
(
County VARCHAR(10) NOT NULL
,Site VARCHAR(10) NOT NULL
,SiteName VARCHAR(10) NOT NULL
,Date VARCHAR(6) NOT NULL
,Incident VARCHAR(5) NULL
,Priority CHAR(2) NULL
);
INSERT @t
(
County
,Site
,SiteName
,Date
,Incident
,Priority
)
VALUES
('C1', 'S1', 'Sn1', 'Jan-19', 'INC3', '')
,('C1', 'S1', 'Sn1', 'Jan-19', '', '')
,('C1', 'S1', 'Sn1', 'Feb-19', 'INC2', '')
,('C1', 'S1', 'Sn1', 'Feb-19', 'INC1', '')
,('C1', 'S1', 'Sn1', 'Feb-19', '', '')
,('C1', 'S2', 'Sn2', 'Jan-19', '', '')
,('C1', 'S2', 'Sn2', 'Feb-19', '', '');
查询:
SELECT
list.County
,list.Site
,list.SiteName
,list.Date
,COALESCE(t1.Incident, '') AS Incident
,COALESCE(t1.Priority, '') AS Priority
FROM
(
SELECT
t.County
,t.Site
,t.SiteName
,t.Date
FROM
@t AS t
GROUP BY
t.County
,t.Site
,t.SiteName
,t.Date
) AS list
LEFT JOIN
@t AS t1
ON
t1.County = list.County
AND t1.Site = list.Site
AND t1.SiteName = list.SiteName
AND t1.Date = list.Date
AND t1.Incident <> '';
结果:
+--------+------+----------+--------+----------+----------+
| County | Site | SiteName | Date | Incident | Priority |
+--------+------+----------+--------+----------+----------+
| C1 | S1 | Sn1 | Feb-19 | INC2 | |
| C1 | S1 | Sn1 | Feb-19 | INC1 | |
| C1 | S1 | Sn1 | Jan-19 | INC3 | |
| C1 | S2 | Sn2 | Feb-19 | | |
| C1 | S2 | Sn2 | Jan-19 | | |
+--------+------+----------+--------+----------+----------+
我有如图所示的事件数据:
我想根据这些条件编写查询:
如果特定月份有基于县、站点和月份的事件数据,则应删除空事件行,如红色所示 "X"
如果没有基于县、地点和日期的事件数据,则应保留空行,如绿色勾号所示
我不会使用函数或存储过程。
您需要 County
、Site
、“站点编号, and
日期(month), and then you want
事件and
优先级”的所有唯一组合的列表,如果它们存在。
这是一道两步题。首先,生成唯一值列表。那是带有 GROUP BY
的内部子查询。
然后执行 LEFT JOIN
回到基础 table,但仅在 Incident
存在的地方。这是 ON
子句中的最后一个 JOIN
条件。
结果集将仅显示 Incident
存在的数据(删除您想要删除的空记录),但将为每个没有任何事件的唯一组合创建一个空记录。 COALESCE
语句只是 window 使结果漂亮的修饰。
数据设置:
DECLARE @t TABLE
(
County VARCHAR(10) NOT NULL
,Site VARCHAR(10) NOT NULL
,SiteName VARCHAR(10) NOT NULL
,Date VARCHAR(6) NOT NULL
,Incident VARCHAR(5) NULL
,Priority CHAR(2) NULL
);
INSERT @t
(
County
,Site
,SiteName
,Date
,Incident
,Priority
)
VALUES
('C1', 'S1', 'Sn1', 'Jan-19', 'INC3', '')
,('C1', 'S1', 'Sn1', 'Jan-19', '', '')
,('C1', 'S1', 'Sn1', 'Feb-19', 'INC2', '')
,('C1', 'S1', 'Sn1', 'Feb-19', 'INC1', '')
,('C1', 'S1', 'Sn1', 'Feb-19', '', '')
,('C1', 'S2', 'Sn2', 'Jan-19', '', '')
,('C1', 'S2', 'Sn2', 'Feb-19', '', '');
查询:
SELECT
list.County
,list.Site
,list.SiteName
,list.Date
,COALESCE(t1.Incident, '') AS Incident
,COALESCE(t1.Priority, '') AS Priority
FROM
(
SELECT
t.County
,t.Site
,t.SiteName
,t.Date
FROM
@t AS t
GROUP BY
t.County
,t.Site
,t.SiteName
,t.Date
) AS list
LEFT JOIN
@t AS t1
ON
t1.County = list.County
AND t1.Site = list.Site
AND t1.SiteName = list.SiteName
AND t1.Date = list.Date
AND t1.Incident <> '';
结果:
+--------+------+----------+--------+----------+----------+
| County | Site | SiteName | Date | Incident | Priority |
+--------+------+----------+--------+----------+----------+
| C1 | S1 | Sn1 | Feb-19 | INC2 | |
| C1 | S1 | Sn1 | Feb-19 | INC1 | |
| C1 | S1 | Sn1 | Jan-19 | INC3 | |
| C1 | S2 | Sn2 | Feb-19 | | |
| C1 | S2 | Sn2 | Jan-19 | | |
+--------+------+----------+--------+----------+----------+