2011-09-07 93 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