【问题标题】:Returning all records until a record equals a certain value Access / SQL query返回所有记录,直到记录等于某个值 Access / SQL 查询
【发布时间】:2016-02-26 19:38:57
【问题描述】:

我正在尝试设置一个查询,该查询将返回表中组的所有记录,直到该表中的记录值等于某个值。

我目前正在使用子查询为表中的每个组选择前 2 条记录,但是如果我需要记录的事件超出前 2 条记录,这将不起作用。我考虑将子查询增加到如果有问题的事件发生在前 2 名,那么前 3 名将返回大量数据。

例如,如果我有

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

我需要为 Tom 返回前 3 条记录,为 gary 返回前 2 条记录。在 Access / SQL 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

  • 您的查询在哪里?我们可以看看吗...
  • 您说...“直到该表中的记录值等于某个值”...汤姆的记录值是多少?
  • 这个问题是关于 MS SQL Server 还是 MS Access?它们是不同的数据库。
  • 我可以使用任何一种我需要一种方法来做到这一点,对于歧义感到抱歉。
  • 您似乎在这里考虑了行的顺序,但表是无序的集合。在您的示例数据中,没有任何内容可用作排序顺序。您需要在此处提供更多详细信息,以便我们提供帮助。

标签: sql-server ms-access-2010


【解决方案1】:

SqlFiddle 目前似乎不适用于 MSSQL。

这里有一些东西可以让你走上正确的道路。我假设您示例中的日期也暗示了时间,因此也暗示了事件的顺序。鉴于此,下面的 SQL 将根据日期时间生成行号并按名称“分组”。针对 PartialResult CTE 的查询将返回生成的行号

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

【讨论】:

  • 我已经使用了您提供的信息,但是它只是返回给 Tom 的信息,而不是 Gary 的任何想法?
  • 当我运行我提供的样本时,我得到了两者的结果,所以我假设它在某种程度上与数据相关。我创建的表结构与您实际使用的表结构有什么根本不同吗?我对日期的假设是(它包括时间部分并且行是唯一的)吗?您可以通过任何方式分享有关数据的更多细节,也许是一些示例的粘贴箱?
  • 您对日期时间的假设是正确的。唯一不同的是我已经有一个自动编号 id 字段,我认为它可以代替 RowNumByName 字段,但这很可能是我不正确的地方。
  • 我的猜测是,您使用的自动编号字段是按顺序递增的,无论是 Tom 还是 Gary,而在我的示例中,“ROW_NUMBER() OVER (PARTITION BY...)”将特定于每个名称。
  • 我用相当于自动增量的方式在本地修改了我的示例,无论我使用它还是使用 RowNumByName,我都得到了很好的结果,所以这不是解释,至少考虑到我的数据的结构方式。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2011-07-18
相关资源
最近更新 更多