2014-01-24 2 views
0

Допустим, у меня есть запись людей и их статусов отношений. У меня также есть таблица, где я решил дать этим людям свои имена. Что-то вроде этого:Выберите последнюю запись и замените значение, если существует

Statuses         Names 
ID | Name | Status | Date    ID | Name 
---------------------------------   ------------- 
01 | Lisa | Divorced | 2013-01-01   01 | Lizzza 
02 | John | Married | 2013-04-04   03 | Alex 
01 | Lisa | Married | 2013-05-05 
01 | Lisa | Single | 2014-01-23 
02 | John | Single | 2014-01-24 

теперь я хотел бы, чтобы выбрать последний статус для каждого человека, в этом списке, я хотел бы также видеть людей из списка с именами, даже если они не находятся в статусе стола , В приведенном выше сценарии, я хотел бы, как иметь этот результат:

ID | Name | Status | Date 
--------------------------------- 
01 | Lizzza | Single | 2014-01-23 
02 | John | Single | 2014-01-24 
03 | Alex | NULL | NULL 

вчера я сделал подобный вопрос в этой теме; Select from other table if value exist, но этот запрос доставит мне весь список статусов. На этот раз мне просто нужна последняя известная запись, а не все.

Быстрый редактировать, я использую SQL Compact/SQL CE

+0

ли Sql поддержка CE Рейтинг функции? –

+0

Вы можете достичь этого, используя функцию Rank() (если поддержка SQL CE) и group by. –

ответ

0
SELECT * FROM 
(
SELECT * 
    , ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Date] DESC) AS rn 
FROM TableName 
)Q 
WHERE rn = 1 
+0

Это не удается. Кажется, что это rn = ROW_NUMBER .., который терпит неудачу. Он говорит, что в этой строке есть ошибка: «Token in error = =» – gubbfett

+0

попробуйте сейчас, он отлично работает с Sql Server, но не уверен в SQL CE. –

+0

Ну, я чувствую себя глупо, что я сам не изменил эту линию, но я как-то ошибся на «ОВЕР» сейчас. – gubbfett

0
select n.id,n.name,s.status,s.date from name n 
left outer join statuses s on n.id=s.id and 
s.date =(select max(date) from statuses st where st.id=n.id) 
+0

Чувствую, что это то, что я могу использовать, но я получаю ошибку при выборе. Я получаю «Token in Error = SELECT». Что странно. «LEFT OUTER JOIN» не поддерживается, но выбор WERE MAX ... должен быть выполнимым. – gubbfett

+0

Кстати, разве это не оставить Лизу? SELECT MAX (Date) ... должен дать мне последнюю дату ...? – gubbfett

+0

Я пробовал в mssql, mysql.above код работает отлично. Вместо левого внешнего соединения просто используйте левое соединение –

0
WITH e AS 
(
    SELECT *, 
     ROW_NUMBER() OVER 
     (
      PARTITION BY ID 
      ORDER BY CONVERT(datetime, [Date], 101) DESC 
     ) AS Recency 
    FROM [Statuses] 
) 
SELECT e.*, n.name 
FROM e left outer join names n on e.id=n.id 
WHERE Recency = 1 
+0

Я получаю «Token in error = OVER». Эта функция, похоже, вообще не работает в CE. – gubbfett

+1

Да, вы правы. У издания CE нет ключевого слова over(). – jainvikram444

Смежные вопросы