返回所有记录,直到记录等于某个值访问/ SQL查询

问题描述:

我试图设置一个查询,该查询将返回表中某个组的所有记录,直到该表中的记录值等于某个值。返回所有记录,直到记录等于某个值访问/ SQL查询

我目前正在为子表查询中的每个组选择前2条记录,但如果我需要记录的事件落在前2位以外,则无法解决问题。我想增加子查询然而到前3名,然后如果有问题的事件在顶部2

发生。例如,返回到多的数据,如果我有

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 

我需要返回第3个记录汤姆和加里的前2个记录。在Access/SQL中有没有简单的方法来做到这一点?

+1

您的查询在哪里?我们可以看到它吗... – zee

+0

你说...“直到该表中的记录值等于某个值”...汤姆的记录值是多少? – zee

+0

这是关于MS SQL Server或MS Access的问题吗?他们是不同的数据库。 – Mureinik

SqlFiddle目前似乎不适用于MSSQL。

这里有一些东西应该让你走上正确的道路。我假设你的例子中的日期也意味着一个时间,因此也是事件的顺序。鉴于此,下面的SQL将根据日期时间生成一个行号,并按名称“分组”。针对PartialResult CTE的查询将返回生成的行号为< = =第一次出现每个名称的“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 
+0

我已经使用了你所提供的东西,但是它只是为Tom而不是Gary回报信息? – Tom

+0

当我运行我提供的样本时,我得到了两个结果,所以我认为它与数据相关。关于我创建的表格结构和实际使用的内容,有什么根本不同?我对日期的假设(包括时间分量和行是否是唯一的)?您可以分享有关数据的更多细节的任何方式,也许是一些例子的pastebin? – CaseyR

+0

你对日期时间的假设是正确的。唯一不同的是,我已经有一个自动编号的ID字段,我认为这将取代RowNumByName字段,但这很可能是我错误的地方。 – Tom