2014-01-22 3 views
0

я таблица тат выглядит следующим образом:SQL Server Выберите самые последние записи только

Table1

ID Date  TermDate Cancel 
1 20140101 99999999 20140102 
1 20140101 20130102 20140102 

2 20140108 20130102 20140102 
2 20140101 99999999 20140102 

3 20140101 99999999 20140102 
3 20140101 99999999 20140102 
3 20140101 99999999 20140709 

То, что я хочу сделать, это, в группе по каждому ID и выбрать только самые последние запись. Сначала мне нужно проверить столбец Date, оттуда, если запись более поздняя, ​​тогда мне не нужно проверять другие столбцы, в этом случае это ID # 2.

Если столбец Дата одно и то же для той же ID, то я хочу, чтобы сравнить столбец Отменить, в зависимости от того является самым последним, то, что запись должна отображаться только в данном случае это ID 3.

Если оба столбца «Дата» и «Отмена» совпадают, тогда мне нужно сравнить столбец «TermDate», и самое последнее должно отображаться, в этом случае это ID # 1. Все столбцы - это тип int.

В основном результат должен быть:

ID Date  TermDate Cancel 
1 20140101 99999999 20140102 
2 20140108 20130102 20140102 
3 20140101 99999999 20140709 

Я не лучший человеком, с самим собой объединением таблиц и действительно не знает, как начать работу с этим ... то, что я в настоящее время сделать это: скопировать таблицу в Excel файл, а затем выполнить работу вручную ... Я имею в виде использовать саз, но на самом деле не знаю, как преобразовать свою логику SQL правильного кода, вот мой pseducode:

SELECT (CASE WHEN Date > DATE THEN SELECT the greater Date 
     CASE WHEN Date = Date THEN SELECT the grater Cancel 
     ELSE WHEN Date = Date AND Cancel = Cancel THEN SELECT the grater TermDate END) 
FROM Table1 
GROUP BY ID 

Я не» t даже знаю, как сделать таблицу похожей на приведенную выше с аргументом case ,

Пожалуйста, дайте мне знать, что является лучшим способом сделать это ... Я искал в Интернете без помощи.

ответ

3

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

select id, [date], termdate, cancel from 
    (select id, [date], termdate, cancel, 
     dense_rank() over (partition by id order by [date] desc, cancel desc, termdate desc) rank 
    from table1) X 
where rank = 1 

SQL Fiddle Demo

+2

Я никогда бы не догадался с dense_rank(), я обязательно попробую ваше решение и дам вам знать результат. Большое вам спасибо за ваше время. – user3221917

+0

Один вопрос, работает ли dense_rank только с varchar? Поскольку мои поля все int, означает ли это, что мне нужно отправить их в varchar? Еще раз спасибо. – user3221917

+0

Нет, он работает со всеми типами данных. Я обновил свой Fiddle - теперь у него есть новая ссылка в ответе. – Szymon

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