Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Laroux Member Откуда: Сообщений: 57 |
Всем привет! Умею писать запросы более-менее простенькие. Но тут возникла необходимость сделать следующие 2 задачи: 1) Есть таблица с полями ID (уникальное), Date, Name. Необходимо выбрать только те записи, которые были в промежутке date1-date2 и при этом во всей таблице с таким Name должна быть только одна запись; 2) Выбрать из той же таблицы только последние по Date (или по ID) записи. Заранее благодарен за подсказку |
28 май 15, 14:18 [17701520] Ответить | Цитировать Сообщить модератору |
zasandator Member [скрыт] [заблокирован] Откуда: Сообщений: 4887 |
Laroux, select top(1) ... with ties ... order by row_number() over (partition by Name order by ID) desc |
28 май 15, 14:26 [17701570] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Laroux, 1) select ID, Date, Name from таблица t1 where Date between @date1 and @date2 and not exists (select 1 from таблица t2 where t1.Name = t2.Name and t1.ID <> t2.ID) 2) with t1 as (select ID, Date, Name, row_number() over (partition by Name order by Date desc) as rn--или order by ID desc from таблица ) select ID, Date, Name from t1 where rn = 1 |
28 май 15, 14:27 [17701579] Ответить | Цитировать Сообщить модератору |
Laroux Member Откуда: Сообщений: 57 |
О, спасибо, ребят.. А можно вопросик? я не понял конструкции select 1 from таблица t2 where t1.Name = t2.Name and t1.ID <> t2.ID что за "1"? |
28 май 15, 14:34 [17701633] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
можно так: select ID, Date, Name from таблица t1 where Date between @date1 and @date2 and not exists (select 1/0 from таблица t2 where t1.Name = t2.Name and t1.ID <> t2.ID) |
||
28 май 15, 14:38 [17701659] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
1 - это число 1 |
||
28 май 15, 14:38 [17701663] Ответить | Цитировать Сообщить модератору |
Laroux Member Откуда: Сообщений: 57 |
Но все равно непонятно.. может ткнёте куда почитать, чтобы разобраться? |
||||
28 май 15, 14:45 [17701707] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вам непонятно, что такое "число" ? |
||
28 май 15, 14:46 [17701714] Ответить | Цитировать Сообщить модератору |
Laroux Member Откуда: Сообщений: 57 |
Glory, мне непонятна конструкция not exists (select 1 from таблица t2 where t1.Name = t2.Name and t1.ID <> t2.ID) причем тут 1 (или 1/0)? |
28 май 15, 14:47 [17701722] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Laroux, ну так почитайте про not exists. Что там писать в select внутри этой конструкции - не очень важно. https://msdn.microsoft.com/en-us/library/ms188336.aspx |
28 май 15, 14:49 [17701743] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
вот как раз ни при чём(!!!) именно это я вам и пытался показать конструкцией 1/0 |
||
28 май 15, 14:49 [17701744] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Наверное тогда самое время обратится к учебной литературе, где объясняется, что такое select, из чего он состоит и тп
Ну если вам не нравится 1, то напишите туда 100 или 666 или еще что-нибудь |
||||
28 май 15, 14:51 [17701748] Ответить | Цитировать Сообщить модератору |
edyaN Member Откуда: Сообщений: 185 |
в данном контексте 1 это просто наполнитель или псевдооптимизация. Смело заменяйте на звездочку. |
||
28 май 15, 19:06 [17703551] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |