返回所有记录,直到一条记录等于某个值 Access / SQL query
Returning all records until a record equals a certain value Access / SQL query
我正在尝试设置一个查询,该查询将 return table 中一组的所有记录,直到 table 中的记录值等于某个值。
我目前正在使用子查询为 table 中的每个组选择前 2 条记录,但是如果我需要记录的事件不在前 2 条记录中,那将无法解决。我想关于将子查询增加到前 3 名,但是如果相关事件发生在前 2 名中,那么 return 就会有很多数据。
例如,如果我有
Name Date Event
Tom 5/5 Test
Tom 5/5 Test
Tom 5/5 Stop Test
Tom 5/5 Test
Tom 5/5 Test
Gary 5/5 Test
Gary 5/5 Stop Test
Gary 5/5 Test
我需要 return 汤姆的前 3 条记录和加里的前 2 条记录。在 Access / SQL?
中是否有一种简单的方法可以做到这一点
SqlFiddle 目前似乎不适用于 MSSQL。
这里有一些内容可以让您走上正确的道路。我假设您的示例中的日期也意味着时间,因此也意味着事件的顺序。鉴于此,下面的 SQL 将根据日期时间和名称 "grouped" 生成行号。针对 PartialResult CTE 的查询将 return 生成的行号 <= 每个名称的 "Stop Test" 事件第一次出现的行。
BEGIN TRANSACTION
CREATE TABLE [NameDateEvent]
(
[Name] [NVARCHAR](100) NOT NULL,
[Date] DATETIME NOT NULL,
[Event] [NVARCHAR](100) NOT NULL,
)
GO
INSERT INTO [NameDateEvent]
VALUES
('Tom','2016-02-26 14:55:38.517', 'Test')
,('Tom','2016-02-26 14:55:39.517', 'Test')
,('Tom','2016-02-26 14:55:40.517', 'Stop Test')
,('Tom','2016-02-26 14:55:41.517', 'Test')
,('Tom','2016-02-26 14:55:42.517', 'Test')
,('Gary','2016-02-26 14:55:43.517', 'Test')
,('Gary','2016-02-26 14:55:44.517', 'Stop Test')
,('Gary','2016-02-26 14:55:45.517', 'Test')
GO
;WITH PartialResult AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY [Date]) AS [RowNumByName]
FROM [NameDateEvent]
)
SELECT *
FROM PartialResult pr
WHERE pr.[RowNumByName] <= (SELECT MIN([RowNumByName]) FROM PartialResult prr WHERE prr.Name = pr.Name AND prr.Event = 'Stop Test')
ROLLBACK
我正在尝试设置一个查询,该查询将 return table 中一组的所有记录,直到 table 中的记录值等于某个值。
我目前正在使用子查询为 table 中的每个组选择前 2 条记录,但是如果我需要记录的事件不在前 2 条记录中,那将无法解决。我想关于将子查询增加到前 3 名,但是如果相关事件发生在前 2 名中,那么 return 就会有很多数据。
例如,如果我有
Name Date Event
Tom 5/5 Test
Tom 5/5 Test
Tom 5/5 Stop Test
Tom 5/5 Test
Tom 5/5 Test
Gary 5/5 Test
Gary 5/5 Stop Test
Gary 5/5 Test
我需要 return 汤姆的前 3 条记录和加里的前 2 条记录。在 Access / SQL?
中是否有一种简单的方法可以做到这一点SqlFiddle 目前似乎不适用于 MSSQL。
这里有一些内容可以让您走上正确的道路。我假设您的示例中的日期也意味着时间,因此也意味着事件的顺序。鉴于此,下面的 SQL 将根据日期时间和名称 "grouped" 生成行号。针对 PartialResult CTE 的查询将 return 生成的行号 <= 每个名称的 "Stop Test" 事件第一次出现的行。
BEGIN TRANSACTION
CREATE TABLE [NameDateEvent]
(
[Name] [NVARCHAR](100) NOT NULL,
[Date] DATETIME NOT NULL,
[Event] [NVARCHAR](100) NOT NULL,
)
GO
INSERT INTO [NameDateEvent]
VALUES
('Tom','2016-02-26 14:55:38.517', 'Test')
,('Tom','2016-02-26 14:55:39.517', 'Test')
,('Tom','2016-02-26 14:55:40.517', 'Stop Test')
,('Tom','2016-02-26 14:55:41.517', 'Test')
,('Tom','2016-02-26 14:55:42.517', 'Test')
,('Gary','2016-02-26 14:55:43.517', 'Test')
,('Gary','2016-02-26 14:55:44.517', 'Stop Test')
,('Gary','2016-02-26 14:55:45.517', 'Test')
GO
;WITH PartialResult AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY [Date]) AS [RowNumByName]
FROM [NameDateEvent]
)
SELECT *
FROM PartialResult pr
WHERE pr.[RowNumByName] <= (SELECT MIN([RowNumByName]) FROM PartialResult prr WHERE prr.Name = pr.Name AND prr.Event = 'Stop Test')
ROLLBACK