powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом
21 сообщений из 21, страница 1 из 1
Помогите с запросом
    #39621581
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с данными:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @table table ([Date] date not null,[Value] bit not null)
insert into @table values
('2018-03-10',1),
('2018-03-11',1),
('2018-03-12',0),
('2018-03-13',0),
('2018-03-14',0),
('2018-03-15',1),
('2018-03-16',1),
('2018-03-17',0),
('2018-03-18',1),
('2018-03-19',0),
('2018-03-20',0),
('2018-03-21',0)


Как вывести первую (по [Date] asc) запись, где [Value] = 0, но находится между двух аналогичных записей? Курсором не хотелось бы.
Для приведённых данных, верным решением были бы строки c [Date] '2018-03-13' и '2018-03-20'.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39621604
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE [Value]=0 AND LEAD([Value])=0 AND LAG([Value])=0
...
Рейтинг: 0 / 0
Помогите с запросом
    #39621625
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант (добавил несколько строк в исходные данные):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
declare @table table (date date not null, value bit not null)
insert @table
values
	('2018-03-10',1),
	('2018-03-11',1),
	('2018-03-12',0),
	('2018-03-13',0),
	('2018-03-14',0),
	('2018-03-15',1),
	('2018-03-16',1),
	('2018-03-17',0),
	('2018-03-18',1),
	('2018-03-19',0),
	('2018-03-20',0),
	('2018-03-21',0),
	('2018-03-22',0),
	('2018-03-23',1),
	('2018-03-24',0),
	('2018-03-25',0),
	('2018-03-26',1)

;
with
	t1 as
	(
	select
		date, value,
		datediff(dd, '20180101', date) - row_number()over(partition by value order by date) as g
	from
		@table
	where
		value = 0
	),
	t2 as
	(
	select
		date, value,
		count(g)over(partition by g) as cn,
		row_number()over(partition by g order by date) as rn
	from
		t1
	)

select
	date, value
from
	t2
where
	cn > 2 and
	rn = 2
...
Рейтинг: 0 / 0
Помогите с запросом
    #39621650
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка,
Я не вижу в задании ограничения, что даты должны быть последовательны...
...
Рейтинг: 0 / 0
Помогите с запросом
    #39621652
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка,

Ну последнее условие некорректно (не попадает '2018-03-21'), правильнее:
Код: sql
1.
where rn between 2 and cn-1
...
Рейтинг: 0 / 0
Помогите с запросом
    #39621744
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KopellyЯ не вижу в задании ограничения, что даты должны быть последовательны...поэтому я и написал "как вариант", точные условия знает ТС ему и решать.

KopellyНу последнее условие некорректно (не попадает '2018-03-21')=Сергей=Как вывести первую (по [Date] asc) запись, где [Value] = 0, но находится между двух аналогичных записей
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622038
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем leag&lag???
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with Q as 

(select X.date, X.bit
   from (values ('2018-03-10',1),
                ('2018-03-11',1),
                ('2018-03-12',0),
                ('2018-03-13',0),
                ('2018-03-14',0),
                ('2018-03-15',1),
                ('2018-03-16',1),
                ('2018-03-17',0),
                ('2018-03-18',1),
                ('2018-03-19',0),
                ('2018-03-20',0),
                ('2018-03-21',0)) as X(date, bit))

select top 1 with ties q.date, q.bit
  from Q as q
 order by 
       max(q.bit) over(order by q.date rows between 1 preceding and 1 following),
          sum(-1) over(order by q.date rows between 1 preceding and 1 following)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622046
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622054
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=Сергей=,
А для такого набора данных, Вы что ожидаете?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
('2018-03-10',1),
('2018-03-11',1),
('2018-03-12',0),
('2018-03-12',0),
('2018-03-13',0),
('2018-03-13',0),
('2018-03-14',0),
('2018-03-15',1),


Код: sql
1.
2.
3.
4.
5.
6.
|       date | bit |
|------------|-----|
| 2018-03-12 |   0 |
| 2018-03-13 |   0 |
| 2018-03-13 |   0 |
| 2018-03-20 |   0 |


или чтобы 2018-03-13 была 1 раз, а для 2018-03-12 какую предпочитать?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622055
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin,

1. Если нет записей удовлетворяющих условию, то все-равно что-то неверное вернет.
2. Нет отсева по "Как вывести первую (по [Date] asc) запись, где [Value] = 0, но находится между двух аналогичных записей"
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622060
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Сергей=,

WHERE [Value]=0 AND LEAD([Value])=0 AND LAG([Value])=0 AND LEAD([Value],2,1)=1
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622061
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly=Сергей=,

WHERE [Value]=0 AND LEAD([Value])=0 AND LAG([Value])=0 AND LEAD([Value],2,1)=1 окна в предикате уже можно?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622081
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправел,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with Q as 

(select X.date, X.bit
from (values 
('2018-03-10',1),
('2018-03-11',1),
('2018-03-12',0),
('2018-03-13',0),
('2018-03-14',0),
('2018-03-15',0),
('2018-03-16',0),
('2018-03-17',0),
('2018-03-18',1),
('2018-03-19',0),
('2018-03-20',0),
('2018-03-21',0),
('2018-03-22',1),
('2018-03-23',0),
('2018-03-24',0),
('2018-03-25',0)) as X(date, bit))

select top 1 with ties a.date, a.bit
  from (select top 1 with ties q.date, q.bit,
                     sum(-1) over(order by q.date rows between 1 preceding and unbounded following)
               -row_number() over(partition by bit order by date) as r
          from Q as q
         order by max(q.bit) over(order by q.date rows between 1 preceding and 1 following)) as a
  order by row_number() over(partition by a.r order by a.date)



sqlfiddle
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622087
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin,

6 сортировок?
в чём цимес?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622090
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дедушка, если вы про фиддл?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622091
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, всем огромное спасибо, очень интересные решения!!!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622101
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=Сергей=, ой, бяда, случицца, если все однёрки ТС, не принимай близко к сердцу
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622102
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
творчество
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622212
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with Q as 

(select X.date, X.bit
   from (values ('2018-03-01',0),  
                ('2018-03-02',0),
                ('2018-03-03',0),      
                ('2018-03-05',0),      
                ('2018-03-07',0),
                ('2018-03-08',0),      
                ('2018-03-10',1),
                ('2018-03-11',1),
                ('2018-03-13',0),
                ('2018-03-13',0),
                ('2018-03-14',0),
                ('2018-03-15',0),
                ('2018-03-16',0),
                ('2018-03-17',0),
                ('2018-03-18',1),
                ('2018-03-19',0),
                ('2018-03-20',0),
                ('2018-03-20',0),
                ('2018-03-21',0),
                ('2018-03-22',1),
                ('2018-03-23',0),
                ('2018-03-24',0),
                ('2018-03-27',0)) as X(date, bit))

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select min(b.date)
  from (select a.date, a.bit, a.s,
               row_number() over(order by a.date) 
             - row_number() over(partition by a.s order by a.date) as r
          from (select q.date, q.bit,
                       sum(1 - q.bit) over(order by q.date rows between 1 preceding and 1 following) as s 
                                                              /*between @preced_Row preceding and @follow_Row*/
                  from Q as q) as a) as b
                 where b.s = 3  /*@preced_Row + @follow_Row + 1*/
 group by b.r


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select b.date, b.bit
  from (select a.date, a.bit, a.x,
               lag(a.x, 1, null) over(order by a.date) as lx
          from (select q.date, q.bit,
                       iif(q.bit = 0 and 
                       lead(q.bit, 1, null) over(order by q.date) = 0 and
                        lag(q.bit, 1, null) over(order by q.date) = 0, 'x', '') as x
                  from Q as q) as a) as b
 where b.x = 'x' and b.lx = ''


Пожалуй, разница будет только в том, захочет ли, когда либо ТС увеличить окно от "между двух аналогичных записей" до N записей. И еще неплохо было бы понять, что будет при дублях даты с разными битами.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39622373
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KopellyДедушка,
Ну последнее условие некорректно (не попадает '2018-03-21'), правильнее:
Код: sql
1.
where rn between 2 and cn-1


Сломается, и так, на данных из спойлера выше.
Дедушка... точные условия знает ТС ему и решать.
ТС набросил!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39623710
marsyakupov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Select [Date],[Value]
From @table t1
Where t1.[Value] = 0
and not exists (select * from @table t2 where t2.[Date]=DATEADD (day,1,t1.[Date] ) and t2.[Value]=1)
and not exists (select * from @table t2 where t2.[Date]=DATEADD (day,-1,t1.[Date] ) and t2.[Value]=1)
and exists (select * from @table t2 where t2.[Date]=DATEADD (day,1,t1.[Date] ))
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]