Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
defragmentator Member Откуда: Сообщений: 20504 |
Добрый день, уважаемые форумчане. Да таблица со столбцами [ID] int, Atrib bit, [Date] date Возможно ли одним запросом выбрать из таблицы первые по датам строки, у которых Atrib = 1 ? Простой select не помогает :) |
28 авг 16, 12:11 [19599555] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Уточняю: выбрать первые в хронологическом порядке строки, у которых Atrib = 1. Здесь возможен только курсор или можно проще и быстрее? Сервер 2008 R2 |
28 авг 16, 12:28 [19599581] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Первые за день? |
28 авг 16, 12:41 [19599602] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
В дате только дата или еще и время? То есть первые по времени или первые по прядку? |
28 авг 16, 12:42 [19599604] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9636 |
with s as ( select ID, Attrib, [Date], row_number() over (order by [Date]) as rn from Таблица where Attrib = 1 ) select ID, Attrib, [Date] from s where rn = 1; |
28 авг 16, 12:47 [19599613] Ответить | Цитировать Сообщить модератору |
iljy Member Откуда: Сообщений: 8711 |
defragmentator,select top 1 with ties ... from ... where Attrib = 1 order by date desc |
28 авг 16, 12:49 [19599617] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Считаем, что по дате записи уникальны |
||
28 авг 16, 13:05 [19599636] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Да |
||
28 авг 16, 13:06 [19599639] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
defragmentator, пример данных на входе и на выходе приведите, а то вам сейчас тут накидают... |
28 авг 16, 13:12 [19599649] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Если 3 первые строки Attrib = 1 и 4-я Attrib = 0, то не работает (2 только выводит) |
||
28 авг 16, 13:13 [19599650] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
То же самое 3 записи Attrib = 1 и 1 Attrib = 0 Выводит 1 запись |
||
28 авг 16, 13:16 [19599652] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
with s as (select ID, Attrib, [Date], row_number() over( partition by datediff(day, 0, [Date]) order by [Date] ) as rn from Таблица where Attrib = 1 ) select ID, Attrib, [Date] from s where rn = 1; |
28 авг 16, 13:45 [19599684] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
ок, что-то похожее. Потестирую ещё |
||
28 авг 16, 13:53 [19599695] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Тогда сгруппируй по дате и сделай first(ID) |
||||
28 авг 16, 14:58 [19599764] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Да это всё хрень. Стоит чуть усложнить данные (добавляю чередование строк с разными атрибутами) и вылазят косяки. Здесь тупо отбираются все записи, у которых Attrib = 1. |
||||
28 авг 16, 15:40 [19599794] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
По - моему, без курсора не обойтись |
28 авг 16, 15:41 [19599796] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9636 |
|
||
28 авг 16, 16:03 [19599839] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Сообщений: 15370 Просто треп 12557 88,54% |
||
28 авг 16, 17:47 [19600041] Ответить | Цитировать Сообщить модератору |
iljy Member Откуда: Сообщений: 8711 |
не обойтись без внятной формулировки задачи. Пока ее не было. Ну а так, если пофантазировать на тему "вдруг угадаю", то запрос, выдающий все данные с Atrib = 1, до первой по дате записи с Atrib != 1, выглядит так: with cte as ( select *, ROW_NUMBER() over(order by date, case Atrib when 1 then 0 else 1 end, ID) RN from Table ) select * from cte where RN < (select top 1 RN from cte where Atrib != 1 order by rn) |
||
28 авг 16, 19:59 [19600293] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |