Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом / 21 сообщений из 21, страница 1 из 1
27.03.2018, 21:30
    #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
27.03.2018, 22:46
    #39621604
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
WHERE [Value]=0 AND LEAD([Value])=0 AND LAG([Value])=0
...
Рейтинг: 0 / 0
28.03.2018, 00:09
    #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
28.03.2018, 05:03
    #39621650
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Дедушка,
Я не вижу в задании ограничения, что даты должны быть последовательны...
...
Рейтинг: 0 / 0
28.03.2018, 05:07
    #39621652
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Дедушка,

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

KopellyНу последнее условие некорректно (не попадает '2018-03-21')=Сергей=Как вывести первую (по [Date] asc) запись, где [Value] = 0, но находится между двух аналогичных записей
...
Рейтинг: 0 / 0
28.03.2018, 14:12
    #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
28.03.2018, 14:14
    #39622046
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
...
Рейтинг: 0 / 0
28.03.2018, 14:21
    #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
28.03.2018, 14:22
    #39622055
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
nullin,

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

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

WHERE [Value]=0 AND LEAD([Value])=0 AND LAG([Value])=0 AND LEAD([Value],2,1)=1 окна в предикате уже можно?
...
Рейтинг: 0 / 0
28.03.2018, 14:47
    #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
28.03.2018, 14:54
    #39622087
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
nullin,

6 сортировок?
в чём цимес?
...
Рейтинг: 0 / 0
28.03.2018, 14:57
    #39622090
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Дедушка, если вы про фиддл?
...
Рейтинг: 0 / 0
28.03.2018, 14:57
    #39622091
=Сергей=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Друзья, всем огромное спасибо, очень интересные решения!!!
...
Рейтинг: 0 / 0
28.03.2018, 15:07
    #39622101
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
=Сергей=, ой, бяда, случицца, если все однёрки ТС, не принимай близко к сердцу
...
Рейтинг: 0 / 0
28.03.2018, 15:07
    #39622102
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
творчество
...
Рейтинг: 0 / 0
28.03.2018, 17:09
    #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
28.03.2018, 22:42
    #39622373
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
KopellyДедушка,
Ну последнее условие некорректно (не попадает '2018-03-21'), правильнее:
Код: sql
1.
where rn between 2 and cn-1


Сломается, и так, на данных из спойлера выше.
Дедушка... точные условия знает ТС ему и решать.
ТС набросил!
...
Рейтинг: 0 / 0
31.03.2018, 15:41
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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