получить только последнюю строку в нескольких записях каждого дня в TSQL - PullRequest
7 голосов
/ 24 марта 2011

У меня есть таблица, что-то вроде:

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)

Я не могу использовать разные из-за отметки времени. Я не могу группировать и использовать:

CAST(CONVERT(FLOAT, EnteredOn) AS INT)

потому что, когда я выбираю поле EnteredOn, оно жалуется, что оно не сгруппировано. Я не могу объединить distinct(cast..date...), потому что не могу получить правильный синтаксис.

Как я могу выбрать - только Имя, EnteredOn, Процент полей с различными для каждого дня?

заранее большое спасибо.

Ответы [ 4 ]

14 голосов
/ 24 марта 2011
;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
8 голосов
/ 24 марта 2011

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
6 голосов
/ 24 марта 2011
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
2 голосов
/ 25 марта 2011

Я бы предложил еще один трюк:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...