Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Практически count, но немного сложнее  [new]
Jaffar
Member

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

select 
'YES = '+cast(sum(case when Col1 = 'yes' then 1 end) as varchar(32))+', '+
'NO  = '+cast(sum(case when Col1 = 'no'   then 1 end) as varchar(32)) Itog
from Table1 t with(nolock)
where
              ...............
21 ноя 16, 14:43    [19916375]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Jaffar
Member

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

недочитал - переходы нужно подсчитать - тогда выше ответили уже., кэп
21 ноя 16, 14:45    [19916391]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
aleks2
o-o
declare @t table (dt date, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 

with cte as
(
  select dt, val,
    row_number() over(order by dt)
      - row_number() over(order by val, dt) as grp
  from @t cross apply (select case OverdueDays when 0 then 0 else 1 end as val)a
),

cte1 as
(
select val
from cte
group by val, grp
)

select val, count(*) as cnt
from cte1
group by val;


Что за бред?
Зачем мучить сервер бессмысленно и беспощадно?

declare @t table (dt date primary key, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 
 
select cnt = count(*), [state] = 'YES'  from @t as t where t.OverdueDays = 1
union all
select cnt = count(*), [state] = 'NO'  from @t as t cross apply (select top(1) OverdueDays from @t as tt where tt.dt < t.dt order by tt.dt desc) as x where t.OverdueDays > 0 and x.OverdueDays = 0;

прежде чем кидаться какашками,
подкинь лучше строк в тестовую таблицу.
кроме трех сканов в плане твоего бреда красуется супер Nested Loops.
и это типа когда-то даже выдаст результат на объеме > 10 строк?
вот тестовые данные,
желающие могут запустить мой и алексов код и сравнить время выполнения.
советую запускать их по одному, ибо мой за секунду результат выдаст,
а вот алексов вряд ли из комы выйдет вообще
create table dbo.test(dt date, OverdueDays int);

insert into dbo.test
select dateadd(year, n_year.n, dateadd(day, n_day.n, '19000101')) as dt,
       case when n_day.n in (14,15) then 0 else n_day.n end as OverdueDays
from nums.dbo.nums n_day 
     cross join  nums.dbo.nums n_year
where n_year.n between 0 and 8099
      and n_day.n between 0 and 28;
21 ноя 16, 16:42    [19917175]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
FreeBard
Member

Откуда:
Сообщений: 223
По сути вариация задачи о нахождении островков
24 ноя 16, 14:14    [19929904]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Strangers
Member [заблокирован]

Откуда: Україна
Сообщений: 2613
declare @t table (dt date primary key, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 
 
;with asd as
(SELECT row_number() OVER (ORDER BY dt) as ID, CASE WHEN OverdueDays > 0 THEN 'YES' ELSE 'NO' END as OverdueDays
FROM @t)
SELECT t1.OverdueDays as state, COUNT(*) cnt
FROM asd t1
	LEFT JOIN asd t2 ON t1.ID = t2.ID + 1
WHERE t1.OverdueDays<>ISNULL(t2.OverdueDays,-1)	
GROUP BY t1.OverdueDays
24 ноя 16, 15:58    [19930525]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
o-o
прежде чем кидаться какашками,
подкинь лучше строк в тестовую таблицу.
кроме трех сканов в плане твоего бреда красуется супер Nested Loops.
и это типа когда-то даже выдаст результат на объеме > 10 строк?
вот тестовые данные,
желающие могут запустить мой и алексов код и сравнить время выполнения.
советую запускать их по одному, ибо мой за секунду результат выдаст,
а вот алексов вряд ли из комы выйдет вообще
create table dbo.test(dt date, OverdueDays int);


Ты, болезный, про индексы то не слыхал, наверное?

В кучке дерьма
create table dbo.test(dt date, OverdueDays int);

завсегда скан рулит.
24 ноя 16, 19:00    [19931309]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Зачем все эти джойны? Оконная функция lag в помощь и последующая группировка с sum
24 ноя 16, 19:35    [19931394]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
Верблюд
Оконная функция lag в помощь и последующая группировка с sum
Потому что 2008R2.
24 ноя 16, 19:53    [19931425]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
+ Сравним
if object_id('tempdb..#t', 'U') is not null
 drop table #t;

create table #t (dt int identity primary key, OverdueDays int);
go

declare @t table (dt date, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 

insert into #t
select top (3000000)
 t.OverdueDays
from
 @t t cross join
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;

declare @r table ([description] varchar(30), elapsed_time int);
declare @v int, @c int, @dt datetime;

select @dt = getdate();
with cte as
(
  select dt, val,
    row_number() over(order by dt)
      - row_number() over(order by val, dt) as grp
  from #t cross apply (select case OverdueDays when 0 then 0 else 1 end as val)a
),
cte1 as
(
select val
from cte
group by val, grp
)
select @v = val, @c = count(*)
from cte1
group by val
option (maxdop 1);
insert into @r values ('o-o', datediff(ms, @dt, getdate()));

select @dt = getdate();
select
  @v = t.val, @c = t.cnt
from
(
 select cnt = count(*), 1 as val  from #t as t where t.OverdueDays = 1
 union all
 select cnt = count(*), 0  from #t as t cross apply (select top(1) OverdueDays from #t as tt where tt.dt < t.dt order by tt.dt desc) as x where t.OverdueDays > 0 and x.OverdueDays = 0
) t
option (maxdop 1);
insert into @r values ('aleks2', datediff(ms, @dt, getdate()));

select @dt = getdate();
with asd as
(SELECT row_number() OVER (ORDER BY dt) as ID, CASE WHEN OverdueDays > 0 THEN 1 ELSE 0 END as OverdueDays
FROM #t)
SELECT @v = t1.OverdueDays, @c = count(*)
FROM asd t1
	LEFT JOIN asd t2 ON t1.ID = t2.ID + 1
WHERE t1.OverdueDays<>ISNULL(t2.OverdueDays,-1)	
GROUP BY t1.OverdueDays
option
 (maxdop 1);
insert into @r values ('Strangers', datediff(ms, @dt, getdate()));

select @dt = getdate();
with a as
(
 select
  dt,
  case when OverdueDays = 0 then 0 else 1 end as OverdueDays,
  case when lead(OverdueDays) over (order by dt) = 0 then 0 else 1 end as NextOverdueDays
 from
  #t t 
)
select
 @v = OverdueDays, @c = count(*)
from
 a
where
 OverdueDays <> NextOverdueDays
group by
 OverdueDays
option (maxdop 1);
insert into @r values ('lead()', datediff(ms, @dt, getdate()));

select * from @r order by elapsed_time;
go
descriptionelapsed_time
aleks22453
Strangers2800
lead()4036
o-o5390
24 ноя 16, 20:08    [19931454]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
aleks2
Guest
invm
Сравним

И тебе не лень?
25 ноя 16, 05:56    [19932375]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
aleks2
invm
Сравним

И тебе не лень?

Он тайно надеялся, что ты на радостях выбежишь на улицу орать: "бред на 3млн записей проиграл 3 секунды, сервер надорвался и крякнул, аллилуйя!"
Ну и там, прыгая на одной ножке, мали ли, подскользнешься и язык прикусишь
У вас ведь давняя взаимная любовь, я помню!
25 ноя 16, 09:07    [19932557]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
бодрый топик :)
with a as(
  select
    a,
    row_number()over(order by(select 0)) n
  from(values ('YES'),
        ('YES'),
        ('YES'),
        ('NO'),
        ('NO'),
        ('NO'),
        ('NO'),
        ('NO'),
        ('YES'),
        ('YES'),
        ('NO'),
        ('NO'),
        ('YES'),
        ('NO'),
        ('YES'))a(a)
),b as(
  select distinct a,n-dense_rank()over(order by a,n)s from a
)
select a,count(*) from b group by a
25 ноя 16, 10:16    [19932796]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
+
/*
if object_id('tempdb..#t', 'U') is not null
 drop table #t;

create table #t (dt int identity primary key, OverdueDays int);
go

declare @t table (dt date, OverdueDays int);
insert into @t values
('2014-12-04', 0),
('2014-12-05', 1),
('2014-12-08', 4),
('2014-12-09', 5),
('2015-01-08', 0),
('2015-01-09', 1),
('2015-01-12', 2),
('2015-01-13', 3),
('2015-01-14', 4),
('2015-01-15', 5),
('2015-01-16', 0),
('2015-01-19', 0),
('2015-02-03', 0),
('2015-02-04', 0),
('2015-02-05', 1),
('2015-02-06', 2),
('2015-08-04', 0); 

insert into #t
select top (3000000)
 t.OverdueDays
from
 @t t cross join
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
*/

declare @r table ([description] varchar(30), elapsed_time int);
declare @v int, @c int, @dt datetime;

select @dt = getdate();
with cte as
(
  select dt, val,
    row_number() over(order by dt)
      - row_number() over(order by val, dt) as grp
  from #t cross apply (select case OverdueDays when 0 then 0 else 1 end as val)a
),
cte1 as
(
select val
from cte
group by val, grp
)
select @v = val, @c = count(*)
from cte1
group by val
option (maxdop 1);
insert into @r values ('o-o', datediff(ms, @dt, getdate()));

select @dt = getdate();
select
  @v = t.val, @c = t.cnt
from
(
 select cnt = count(*), 1 as val  from #t as t where t.OverdueDays = 1
 union all
 select cnt = count(*), 0  from #t as t cross apply (select top(1) OverdueDays from #t as tt where tt.dt < t.dt order by tt.dt desc) as x where t.OverdueDays > 0 and x.OverdueDays = 0
) t
option (maxdop 1);
insert into @r values ('aleks2', datediff(ms, @dt, getdate()));

/*select @dt = getdate();
with asd as
(SELECT row_number() OVER (ORDER BY dt) as ID, CASE WHEN OverdueDays > 0 THEN 1 ELSE 0 END as OverdueDays
FROM #t)
SELECT @v = t1.OverdueDays, @c = count(*)
FROM asd t1
	LEFT JOIN asd t2 ON t1.ID = t2.ID + 1
WHERE t1.OverdueDays<>ISNULL(t2.OverdueDays,-1)	
GROUP BY t1.OverdueDays
option
  (maxdop 1);
insert into @r values ('Strangers', datediff(ms, @dt, getdate()));
*/
select @dt = getdate();
with a as
(
 select
  dt,
  case when OverdueDays = 0 then 0 else 1 end as OverdueDays,
  case when lead(OverdueDays) over (order by dt) = 0 then 0 else 1 end as NextOverdueDays
 from
  #t t 
)
select
 @v = OverdueDays, @c = count(*)
from
 a
where
 OverdueDays <> NextOverdueDays
group by
 OverdueDays
option 
  (maxdop 1);
insert into @r values ('lead()', datediff(ms, @dt, getdate()));

select @dt = getdate();
with a as(
  select
    CASE WHEN OverdueDays > 0 THEN 1 ELSE 0 END as OverdueDays,
    row_number()over(order by dt) n
  from
    #t 
),b as(
  select distinct OverdueDays,n-dense_rank()over(order by OverdueDays,n)s from a
)
select @v = OverdueDays, @c = count(*) from b group by OverdueDays
option
 (maxdop 1);
insert into @r values ('andrey odegov', datediff(ms, @dt, getdate()));

select * from @r order by elapsed_time;
go

Скрипт Strangers убрал, ибо мой сервер не переварил за 5 минут...
25 ноя 16, 11:27    [19933189]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
чего-то если раскомментить слив в переменные
(мы же все переживем вывод двух строк?),
алексов код насчитывает что-то умопомрачительное
(lead ушел в комментарий ибо 2008 R2)

К сообщению приложен файл. Размер - 62Kb
25 ноя 16, 12:19    [19933547]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
пардон, Strangers-ов код все еще с переменными был,
но вот теперь все выводят результат:

К сообщению приложен файл. Размер - 65Kb
25 ноя 16, 12:27    [19933599]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Раз не 2012 и выше, значит LAG надо эмулировать

DROP TABLE #t

CREATE TABLE #t
(
	id      INT CONSTRAINT PK_x PRIMARY KEY,
	val     CHAR(3)
)

INSERT #t
VALUES	(1, 'No'), (2, 'Yes'), (3, 'No'), (4, 'No')

DECLARE @cnt1     INT,
        @cnt2     INT,
        @lag      CHAR(3) = ''

UPDATE	t
SET 	@cnt1 = ISNULL(@cnt1, 0) + CASE 
    	                                WHEN val != @lag AND val = 'Yes' THEN 1
    	                                ELSE 0
    	                           END,
		@cnt2 = ISNULL(@cnt2, 0) + CASE 
		                                WHEN val != @lag AND val = 'No' THEN 1
		                                ELSE 0
		                           END,
		@lag = val
FROM	#t t WITH (INDEX = PK_x)

SELECT	@cnt1,
		@cnt2
25 ноя 16, 12:39    [19933726]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
Руслан Дамирович
Скрипт Strangers убрал, ибо мой сервер не переварил за 5 минут...

2 варианта: или прописать ему флагом старый оптимизатор:
QUERYTRACEON 9481
или вписать насильный left MERGE join,
он сам чего-то в старших версиях выбирает NL
25 ноя 16, 13:29    [19934030]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
o-o
Руслан Дамирович
Скрипт Strangers убрал, ибо мой сервер не переварил за 5 минут...

2 варианта: или прописать ему флагом старый оптимизатор:
QUERYTRACEON 9481
или вписать насильный left MERGE join,
он сам чего-то в старших версиях выбирает NL

Ну возможно, после появления статистики на таблице, оптимизатор и выбрал бы нормальный план, но вот внедришь такое решение, и никакие индексы потом не спасут - ибо все на совести оптимизатора.

Я считаю, что вариант с противоположными/спещащими row_number понятней (и наглядней, можно даже ручками в excel изобразить) и план "не сломается" после апгрейда...
25 ноя 16, 14:11    [19934348]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
ДинВинчеста
Guest
with cte as (
select 1 as id, 'YES' as field union all
select 2, 'YES' union all
select 3, 'YES' union all
select 4, 'NO' union all
select 5, 'NO' union all
select 6, 'NO' union all
select 7, 'NO' union all
select 8, 'NO' union all
select 9, 'YES' union all
select 10, 'YES' union all
select 11, 'NO' union all
select 12, 'NO' union all
select 13, 'YES' union all
select 14, 'NO' union all
select 15, 'YES'
),
subcte as (
select id,field, (case when isnull((lead(field) over (order by id)), 'x') != field then 1 else 0 end) as flag from cte
)
select field, count(*) from subcte
where flag = 1
group by field
25 ноя 16, 14:16    [19934370]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
Руслан Дамирович
Ну возможно, после появления статистики на таблице, оптимизатор и выбрал бы нормальный план

в данном случае у него со статистикой все то же самое,
что и в случае 2008-ого сервера.
и план ломается при абсолютно той же статистике.
кстати, он тут же встает на место не от обновления статистики,
а от выбора прежнего оптимизатора.

ну и если совсем честно,
то кроме решения от Strangers,
еще и мое и одоегово решения уходят в кому на старших версиях
при определенных тестовых данных.
25 ноя 16, 14:22    [19934416]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz (2 cores) / 64 Gb

Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 
	Enterprise Edition: Build 7601: Service Pack 1 (Hypervisor)

description       elapsed_time
andrey odegov	  6006
Strangers         6040
o-o	          6360
lead()	          7536
aleks2	          9986
25 ноя 16, 14:30    [19934458]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
ну хорошо, давайте теперь заполним таблицу
многократным копированием данных ТС, ок?
с учетом порядка, разумеется.
и ПК навесим в самом конце, будет свежайшая статистика с фуллсканом.
select top 3000000
       row_number() over (order by 1/0) as dt,
       case row_number() over (order by 1/0) % 17
            when 1 then 0
			when 2 then 1
			when 3 then 4
			when 4 then 5
			when 5 then 0
			when 6 then 1
			when 7 then 2
			when 8 then 3
			when 9 then 4
			when 10 then 5
			when 11 then 0
			when 12 then 0
			when 13 then 0
			when 14 then 0
			when 15 then 1
			when 16 then 2
			when 17 then 0 
       end as OverdueDays
into #t 
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
 go

alter table #t alter column dt int not null;
go
alter table #t add primary key(dt);
go
25 ноя 16, 14:39    [19934511]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
o-o
ну хорошо, давайте теперь заполним таблицу
многократным копированием данных ТС, ок?
с учетом порядка, разумеется.
и ПК навесим в самом конце, будет свежайшая статистика с фуллсканом.

aleks2         5506
Strangers      5646
lead()         9033
o-o	       17383
andrey odegov  24236

А давайте делать то же самое, но вообще без индекса
Strangers      9486
lead()         11163
o-o            17143
andrey odegov  22250
aleks2         NULL
25 ноя 16, 15:07    [19934722]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
А вот лучше скажите, что тут можно сделать? И нужно ли, можно ли и стоит ли вообще - ибо кроме как душа перфекциониста требует перфекционизма обоснования нет.
+

WITH
t1 AS (
  SELECT /* точность времени изменения - до секунды */
    [a],
    [b],
    [c],
    [d],
    [prev] = [datechange], 
    [next] = LEAD( [datechange], 1, '99990101' ) 
               OVER (
                 PARTITION BY
                   [a],
                   [b],
                   [c]
                 ORDER BY
                   [datechange] )
  FROM 
    #history
),
t2 AS (
  SELECT /* санация множественных записей в одну и ту же секунду, берем только последнюю запись (rn=1) */ 
    [a],
    [b],
    [c],
    [d],
    [prev],
    [next],
    [rn] = ROW_NUMBER()
             OVER ( 
               PARTITION BY 
                 [a],
                 [b],
                 [c],
                 [prev]
               ORDER BY 
                 [next] DESC )
  FROM 
    t1
),
t3 AS (
  SELECT 
    [a],
    [b],
    [c],
    [prev],
    [next],
    [d],
    [rn] = ROW_NUMBER()
             OVER ( 
               PARTITION BY 
                 [a],
                 [b],
                 [c]
               ORDER BY 
                 [prev] ) - 
           ROW_NUMBER()
             OVER( 
               PARTITION BY
                 [a],
                 [b],
                 [c],
                 [d] 
               ORDER BY 
                 [prev] )
  FROM
    t2
  WHERE
    [rn] = 1
)
SELECT
  [a],
  [b],
  [c],
  [prev] = MIN( [prev] ),
  [next] = MAX( [next] ),
  [d]
INTO 
  #changes
FROM 
  t3
GROUP BY
  [rn],
  [a],
  [b],
  [c],
  [d]
;

25 ноя 16, 15:15    [19934787]     Ответить | Цитировать Сообщить модератору
 Re: Практически count, но немного сложнее  [new]
o-o
Guest
Руслан Дамирович
А давайте делать то же самое, но вообще без индекса

ну мы типа с того и начали.
с полного безрыбья отсутствия индексов: 19917175
только зачем так делать?
ну я-то ладно, у меня такой недосып на этой неделе,
что не то что индекс повесить, у меня сумка в помойке оказалась вместе с мусором,
спасибо еще мусорка не проехала и цыгане не порыбачили в контейнере.

но вы-то зачем туда же? :)
25 ноя 16, 15:20    [19934820]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить