是否可以在匹配的行之间返回所有行?
我正在尝试查询作业写入审计表的审计表。有明确的开始审核消息和结束审核消息以及之间的信息。是否有可能获得一个select语句来返回" start"之间的所有行。审计条目和"结束"条目?
数据示例。
DATE TIME USER ENTRY
----------------------- -------- -------------------- --------------------------------------------------------------------
2015-04-13 07:30:15.150 07:30:15 CmdLne SOME JOB STARTED FOR PROCESSING DATE 13/04/2015
2015-04-13 07:31:15.150 07:31:15 CmdLne PROCESSED 10 WHATEVERS
2015-04-13 07:32:25.150 07:32:25 CmdLne PROCESSED 10 SOMETHINGS
2015-04-13 07:33:33.150 07:33:33 CmdLne PROCESSED 40 XYZ
2015-04-13 07:33:34.150 07:33:34 CmdLne SOME JOB FINISHED FOR PROCESSING DATE 13/04/2015
因为在审计写入期间将会有多少审计条目未知,所以它必须能够选择" start"之间的所有内容。进入"结束"条目。这可能吗?
答案 0 :(得分:1)
这是一个简单而干净的解决方案。如果您有任何问题或需要任何其他信息,请告诉我。
SELECT A.[DATE],
A.[TIME],
A.[User],
A.[Entry]
FROM @Table A
CROSS APPLY(SELECT MIN([Date]) FROM @Table WHERE [Entry] LIKE 'Some Job%') CA_min(start_dt)
CROSS APPLY(SELECT MAX([Date]) FROM @Table WHERE [Entry] LIKE 'Some Job%') CA_max(end_dt)
WHERE [DATE] BETWEEN start_dt AND end_dt
答案 1 :(得分:0)
使用ORDER-BY
尝试一些ASC / DESC
WITH Data (Date, Time, User, Entry) AS
(
SELECT Date, Time, User, Entry
FROM data
ORDER BY DATE ASC, TIME ASC
)
SELECT TOP ((SELECT COUNT(*) FROM Data) - 2) *
FROM (
SELECT TOP ((SELECT COUNT(*) FROM Data) - 1) *
FROM Data
ORDER BY Date ASC, Time ASC -- all rows without the end-row
) tmp
ORDER BY Date ASC, Time DESC -- all rows without the start-row
或者更简单的WHERE
- 条款。
SELECT Date, Time, User, Entry
FROM data
WHERE Entry NOT LIKE '%JOB STARTED%'
AND Entry NOT LIKE '%JOB FINISHED%'
答案 2 :(得分:0)
DECLARE @Table TABLE ([DATE] Datetime ,[TIME] TIME, [USER] VARCHAR(100) , [ENTRY] VARCHAR(1000))
INSERT INTO @Table VALUES
('2015-04-13 07:30:15.150','07:30:15','CmdLne','SOME JOB STARTED FOR PROCESSING DATE 13/04/2015'),
('2015-04-13 07:31:15.150','07:31:15','CmdLne','PROCESSED 10 WHATEVERS'),
('2015-04-13 07:32:25.150','07:32:25','CmdLne','PROCESSED 10 SOMETHINGS'),
('2015-04-13 07:33:33.150','07:33:33','CmdLne','PROCESSED 40 XYZ'),
('2015-04-13 07:33:34.150','07:33:34','CmdLne','SOME JOB FINISHED FOR PROCESSING DATE 13/04/2015') ,
('2015-04-13 07:30:15.150','07:30:15','Powershell','SOME JOB STARTED FOR PROCESSING DATE 13/04/2015'),
('2015-04-13 07:31:15.150','07:31:15','Powershell','PROCESSED 10 WHATEVERS'),
('2015-04-13 07:32:25.150','07:32:25','Powershell','PROCESSED 10 SOMETHINGS'),
('2015-04-13 07:33:33.150','07:33:33','Powershell','PROCESSED 40 XYZ'),
('2015-04-13 07:33:34.150','07:33:34','Powershell','SOME JOB FINISHED FOR PROCESSING DATE 13/04/2015')
SELECT t1.*
FROM @Table t1
WHERE t1.[DATE] >= ( SELECT TOP 1 [DATE] FROM @Table
WHERE [ENTRY] LIKE '%SOME JOB STARTED%'
AND t1.[USER] = [USER])
AND t1.[DATE] <= ( SELECT TOP 1 [DATE] FROM @Table
WHERE [ENTRY] LIKE '%SOME JOB FINISHED%'
AND t1.[USER] = [USER])
AND t1.[USER] = 'CmdLne' --<--
答案 3 :(得分:0)
DECLARE @Table TABLE
(
[DATE] DATETIME ,
[TIME] TIME ,
[USER] VARCHAR(100) ,
[ENTRY] VARCHAR(1000)
)
INSERT INTO @Table
VALUES ( '2015-04-13 07:30:15.150', '07:30:15', 'CmdLne',
'SOME JOB STARTED FOR PROCESSING DATE 13/04/2015' ),
( '2015-04-13 07:31:15.150', '07:31:15', 'CmdLne',
'PROCESSED 10 WHATEVERS' ),
( '2015-04-13 07:32:25.150', '07:32:25', 'CmdLne',
'PROCESSED 10 SOMETHINGS' ),
( '2015-04-13 07:33:33.150', '07:33:33', 'CmdLne', 'PROCESSED 40 XYZ' ),
( '2015-04-13 07:33:34.150', '07:33:34', 'CmdLne',
'SOME JOB FINISHED FOR PROCESSING DATE 13/04/2015' ) ,
( '2015-04-13 07:30:15.150', '07:30:15', 'Powershell',
'SOME JOB STARTED FOR PROCESSING DATE 13/04/2015' ),
( '2015-04-13 07:31:15.150', '07:31:15', 'Powershell',
'PROCESSED 10 WHATEVERS' ),
( '2015-04-13 07:32:25.150', '07:32:25', 'Powershell',
'PROCESSED 10 SOMETHINGS' ),
( '2015-04-13 07:33:33.150', '07:33:33', 'Powershell',
'PROCESSED 40 XYZ' ),
( '2015-04-13 07:33:34.150', '07:33:34', 'Powershell',
'SOME JOB FINISHED FOR PROCESSING DATE 13/04/2015' )
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( PARTITION BY CONVERT(DATE, T.DATE),
T.[USER] ORDER BY T.DATE ) AS RN ,
*
FROM @Table AS T
) T
WHERE T.RN NOT IN ( 1, 2 )