Извлекать только одну из каждой записи на основе даты

#sql-server #webmatrix #razor-2

#sql-server #webmatrix #razor-2

Вопрос:

В настоящее время я работаю с SQL Compact 4 и Razor и пытаюсь получить только одну из каждой записи на основе последней даты

id Name Number LastDate
1 Joe 1111 2014-01-01
2 Sam 2222 2014-01-02
3 Joe 1111 2014-04-11
4 Sam 2222 2014-04-12
5 Lee 3333 2014-04-12

Я пытаюсь записать данные в веб-сетку, но не могу найти правильный оператор SQL для загрузки только идентификаторов 3, 4 и 5, поскольку они являются последними обновленными записями.

Ответ №1:

Попробуйте с

 SELECT id, Name, Number, LastDate FROM yourTable t1 INNER JOIN
    (SELECT Number, MAX(LastDate) AS MaxDate FROM yourTable GROUP BY Number) t2
ON t1.Number = t2.Number AND t1.LastDate = t2.MaxDate
  

Комментарии:

1. Это сработало как шарм! Большое спасибо, что сегодня вы сэкономили немного волос на моей голове.

Ответ №2:

Вы можете сделать это с помощью одного запроса:

 select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.number = t.number and
                        t2.lastdate > t.lastdate
                 );
  

Это реализует логику: «Получите мне все строки, из t которых нет строки с тем же number и более поздним lastdate «.

Комментарии:

1. Спасибо за комментарий, теперь у меня есть два рабочих запроса!

Ответ №3:

Я думаю, что должно сработать что-то подобное (при условии, что вам нужна последняя запись по столбцу «Номер» и что нет повторяющихся дат по номеру):

 select max(lastdate) as lastdate, number into #temp
from t
group by number

select * from #temp t1
inner join t on t.number = t1.number and t.lastdate = t1.lastdate
  

Вот SQL-скрипка: http://www.sqlfiddle.com /#!6/01357/5

(Думая об этом дальше, даже если бы были повторяющиеся даты по номеру, единственным полем, которое отличалось бы, был бы столбец id, который вы, возможно, могли бы использовать МАКСИМУМ в зависимости от ваших требований.)

Комментарии:

1. Этот код генерирует ошибку «System.Data.SqlServerCe.SqlCeException: произошла ошибка при синтаксическом анализе запроса. [ Номер строки токена = 1, смещение строки токена = 42, ошибка токена = в ] »

2. И да, вы правы, я хочу отобразить только последнюю запись number

3. Похоже, SQL CE не поддерживает временные таблицы. Моя ошибка. Вы всегда можете обернуть запрос, который создает временную таблицу, в подзапрос, который должен работать.

Ответ №4:

Вы можете использовать row_number() в операторе OVER следующим образом:

 select id, name, number, lastdate
from
(
  select 
    id, name, number, lastdate,
    row_number() OVER (PARTITION BY Number ORDER BY LastDate DESC) as dateord
  from table
) t
where t.dateord = 1
  

Комментарии:

1. Я попробовал, и я не верю, что эта команда SQL работает на SQL Compact 4, она генерирует и выдает ошибку System.Data.SqlServerCe.SqlCeException: произошла ошибка при разборе запроса. [Номер строки токена = 1, смещение строки токена = 40, ошибка токена = ПРЕВЫШЕНА]

2. @Tman Вы правы: ROW_NUMBER не существует в версии SQL Server Compact.

3. @Tman — не будет работать во всех версиях, но в версиях, с которыми он работает, может быть немного быстрее.