2011-09-07 94 views
2

我在SQL Server數據庫結構如下表:SQL查詢選擇最後一排

enter image description here

我想打一個查詢,會選擇早於參數日期 我是最後一個行進入,通過ID_Club分組,這意味着,該查詢的結果將是這樣的:

4, 1, 166013.01, 343697.42, 748231.00, 2011-02-28, 
8, 2, 331408.11, 6981028.26, 738000.00, 2011-02-28, 
etc... 

我可以做類似的查詢不是最後一排,但與總和。它看起來像:

​​
+0

你可以發佈你的表的DDL? – markus

回答

1

看一看該SQL OVER clause when used with PARTITION小號

SELECT ID_Club, DateStart, DateEnd, Cash, Less, InWay 
FROM Period p 
    INNER JOIN 
     (SELECT ID_Period, ROW_NUMBER() OVER (PARTITION by ID_CLUB ORDER BY ID_Period DESC) as RowNum 
     FROM Period 
       WHERE DateEnd<'2011-03-01') AS x 
     ON p.ID_Period = x.ID_Period 
WHERE x.RowNum = 1 -- Find just the last row in each partition 

你的 「SUM」 查詢將輝l如果在給定的日期範圍內俱樂部還有任何其他非零期記錄

出於興趣,下一版本的SQL(Denali)允許您在一個記錄中詢問「FIRST」或「LAST」記錄分區,從而節省您的嵌套的努力加入

更新:測試DDL/DML

create table Period 
(
ID_Period INT, 
ID_Club INT, 
DateStart DATETIME, 
DateEnd DATETIME, 
Cash MONEY, 
Less MONEY, 
InWay MONEY 
) 

insert into Period (ID_Period, ID_Club, DateStart, DateEnd, Cash, Less, InWay) 
VALUES (1, 1, 2010-08-01, 2010-08-31, 0, 0, 0) 
insert into Period (ID_Period, ID_Club, DateStart, DateEnd, Cash, Less, InWay) 
VALUES (2, 1, 2010-08-01, 2010-08-31, 166013.01, 343697.42, 748231.00) 
insert into Period (ID_Period, ID_Club, DateStart, DateEnd, Cash, Less, InWay) 
VALUES (3, 2, 2010-08-01, 2010-08-31, 0, 0, 0) 
insert into Period (ID_Period, ID_Club, DateStart, DateEnd, Cash, Less, InWay) 
VALUES (4, 2, 2010-08-01, 2010-08-31, 331408.11, 6981028.26, 738000.00) 
3

不太確定如何閱讀您的問題。你只需要在指定日期之前的最新記錄?或者是日期前的所有記錄?

如果它的所有記錄,然後只需刪除聚合函數,並刪除該組by語句,以結束了:

SELECT * FROM dbo.Period WHERE DateEnd < '2011-03-01'; 

如果你想只有最近戰績:

SELECT TOP 1 * FROM dbo.Period WHERE DateEnd < '2011-03-01' ORDER BY DateEnd DESC; 
+0

我想要ID_Club的每個值的最近記錄。 – Metaller