每天只获得TSQL中的多个条目的最后一行

时间:2022-04-04 15:01:00

I have a table, something like:

我有一张桌子,类似于:

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

To summarize the above table, there are three rows for day 09, and two rows for day 10.

总结上表,第09天有三行,第10天有两行。

Now, I just want to select the latest row - one single row - per day.
(one row for 9, one for 10 and the one for 11)

现在,我只想选择最新的行 - 每行一行。 (一行为9,一行为10,一行为11)

I cannot use distinct because of the timestamp. I cant group and use:

由于时间戳,我不能使用distinct。我不能分组并使用:

CAST(CONVERT(FLOAT, EnteredOn) AS INT)

because when I select EnteredOn field, it complaints that its not grouped. I cant combine distinct(cast..date...) because I cant get the right syntax.

因为当我选择EnteredOn字段时,它会抱怨它没有分组。我不能组合distinct(cast..date ...),因为我无法获得正确的语法。

How can I select - only Name, EnteredOn, Percentage fields with distinct to each day?

我如何选择 - 只有Name,EnteredOn,Percentage字段与每天不同?

many thanks in advance.

提前谢谢了。

4 个解决方案

#1


14  

;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

#2


8  

1 row/day:

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 row/person/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

#3


6  

SELECT Name, EnteredOn, Percentage
FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(8),EnteredOn,112) ORDER BY EnteredOn DESC) Corr
        FROM YourTable) A
WHERE Corr = 1

#4


2  

I would suggest one more trick here:

我建议再说一遍:

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)

#1


14  

;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

#2


8  

1 row/day:

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 row/person/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

#3


6  

SELECT Name, EnteredOn, Percentage
FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(8),EnteredOn,112) ORDER BY EnteredOn DESC) Corr
        FROM YourTable) A
WHERE Corr = 1

#4


2  

I would suggest one more trick here:

我建议再说一遍:

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)