2016-02-26 92 views
0

我試圖設置一個查詢,該查詢將返回表中某個組的所有記錄,直到該表中的記錄值等於某個值。返回所有記錄,直到記錄等於某個值訪問/ 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

回答

0

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

相關問題