#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 — не будет работать во всех версиях, но в версиях, с которыми он работает, может быть немного быстрее.