Sql server 仅获取TSQL中每天多个条目的最后一行
我有一张桌子,大概是:Sql server 仅获取TSQL中每天多个条目的最后一行,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我有一张桌子,大概是: Id Name EnteredOn Percentage ````````````````````````````````````````````````````````````` 01 person1 2011-03-09 17:29:35.683 56.29 02 person1 2011-03-09 17:29:35.731 76.29
Id Name EnteredOn Percentage
`````````````````````````````````````````````````````````````
01 person1 2011-03-09 17:29:35.683 56.29
02 person1 2011-03-09 17:29:35.731 76.29
03 person1 2011-03-09 18:15:78.683 56.29
04 person1 2011-03-10 17:29:35.683 56.29
05 person1 2011-03-10 16:29:31.683 56.29
06 person1 2011-03-11 17:29:35.683 56.29
总结上表,第09天有三行,第10天有两行
现在,我只想选择最新的一行-每天一行。
一排9人,一排10人,一排11人
由于时间戳的原因,我无法使用distinct。我不能分组并使用:
CAST(CONVERT(FLOAT, EnteredOn) AS INT)
因为当我选择EnteredOn字段时,它会抱怨它没有分组。我不能把不同的日期组合起来。。。因为我找不到正确的语法
我如何选择只有名称、输入项和百分比字段,并且每天都有不同的字段
非常感谢。1行/天:
SELECT t1.Name, t1.EnteredOn, t1.Percentage
FROM table t1
JOIN (SELECT MAX(EnteredOn) Max_EnteredOn_By_Day
FROM table
GROUP BY convert(varchar, EnteredOn, 112)) t2
ON t1.EnteredOn = t2.Max_EnteredOn_By_Day
1行/人/天:
SELECT t1.Name, t1.EnteredOn, t1.Percentage
FROM table t1
JOIN (SELECT Name, MAX(EnteredOn) Max_EnteredOn_By_Day
FROM table
GROUP BY Name, convert(varchar, EnteredOn, 112)) t2
ON t1.Name = t2.Name
AND t1.EnteredOn = t2.Max_EnteredOn_By_Day
我想在这里再建议一个技巧:
select top 1 with ties
Name, EnteredOn, Percentage
from YourTable
order by row_number() over(partition by datediff(d, 0, EnteredOn) order by Name, EnteredOn desc)
您好,这是可行的,但是,我不明白它的大部分,查询在做什么?esp分区-这是做什么的?此查询在大量行上是否会减慢速度?谢谢,这只考虑日期,很抱歉之前没有提及,我也希望能够对person进行筛选。添加到最后的评论中,选择每天一行特定的person和特定的百分比-类似于此..@iamsearchy-分区方式有点像,而不是group子句。按order by指定的顺序为每行增加行数。分区确定行号何时应再次从1开始。所以,如果您还需要按名称分组,您应该按datediffd、0、EnteredOn、Name等将分区扩展到各个分区,以获得更多需要分组的字段。关于性能,我只能说,您应该使用此处建议的查询运行测试,并选择对您的数据具有最佳性能的查询。非常感谢您的帮助:-
;with cte as
(
select
*,
row_number() over(partition by datediff(d, 0, EnteredOn) order by EnteredOn desc) as rn
from YourTable
)
select *
from cte
where rn = 1
select top 1 with ties
Name, EnteredOn, Percentage
from YourTable
order by row_number() over(partition by datediff(d, 0, EnteredOn) order by Name, EnteredOn desc)