Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Добрый день, уважаемые форумчане.
Да таблица со столбцами
[ID] int, Atrib bit, [Date] date

Возможно ли одним запросом выбрать из таблицы первые по датам строки, у которых Atrib = 1 ?
Простой select не помогает :)
28 авг 16, 12:11    [19599555]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Уточняю: выбрать первые в хронологическом порядке строки, у которых Atrib = 1.
Здесь возможен только курсор или можно проще и быстрее?

Сервер 2008 R2
28 авг 16, 12:28    [19599581]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
982183
Member

Откуда: VL
Сообщений: 3387
Первые за день?
28 авг 16, 12:41    [19599602]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
982183
Member

Откуда: VL
Сообщений: 3387
В дате только дата или еще и время?
То есть первые по времени или первые по прядку?
28 авг 16, 12:42    [19599604]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
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]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
iljy
Member

Откуда:
Сообщений: 8711
defragmentator,

select top 1 with ties ...
from ...
where Attrib = 1
order by date desc
28 авг 16, 12:49    [19599617]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
982183
В дате только дата или еще и время?
То есть первые по времени или первые по прядку?

Считаем, что по дате записи уникальны
28 авг 16, 13:05    [19599636]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
982183
первые по времени

Да
28 авг 16, 13:06    [19599639]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5144
defragmentator,
пример данных на входе и на выходе приведите, а то вам сейчас тут накидают...
28 авг 16, 13:12    [19599649]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
iljy
defragmentator,

select top 1 with ties ...
from ...
where Attrib = 1
order by date desc

Если 3 первые строки Attrib = 1 и 4-я Attrib = 0, то не работает (2 только выводит)
28 авг 16, 13:13    [19599650]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
invm
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;


То же самое 3 записи Attrib = 1 и 1 Attrib = 0
Выводит 1 запись
28 авг 16, 13:16    [19599652]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
aleks2
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:53    [19599695]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
982183
Member

Откуда: VL
Сообщений: 3387
defragmentator
982183
В дате только дата или еще и время?
То есть первые по времени или первые по прядку?

Считаем, что по дате записи уникальны


Тогда сгруппируй по дате и сделай first(ID)
28 авг 16, 14:58    [19599764]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
defragmentator
aleks2
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;



ок, что-то похожее.
Потестирую ещё

Да это всё хрень. Стоит чуть усложнить данные (добавляю чередование строк с разными атрибутами) и вылазят косяки. Здесь тупо отбираются все записи, у которых Attrib = 1.
28 авг 16, 15:40    [19599794]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
По - моему, без курсора не обойтись
28 авг 16, 15:41    [19599796]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
defragmentator
По - моему, без курсора не обойтись
А по-моему, пора уже вот это сделать - 19599649
28 авг 16, 16:03    [19599839]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
aleks2
Guest
defragmentator
По - моему, без курсора не обойтись


Сообщений: 15370

Просто треп 12557 88,54%
28 авг 16, 17:47    [19600041]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать первые строки с признаком  [new]
iljy
Member

Откуда:
Сообщений: 8711
defragmentator
По - моему, без курсора не обойтись


не обойтись без внятной формулировки задачи. Пока ее не было. Ну а так, если пофантазировать на тему "вдруг угадаю", то запрос, выдающий все данные с 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 Ответить