Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена выбросов средними значениями дней недели в sql / 25 сообщений из 27, страница 1 из 2
25.06.2018, 23:00
    #39665625
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
помогите, пожалуйста доработать запрос для чистки данных от выбросов
SELECT t.*
FROM
( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType FROM [Action].[dbo].[promo_data]
where [IsPromo] = 1 group by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType having count(*) >1 ) as x
left outer join [Action].[dbo].[promo_data] as t on x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum]
and x.[DocumentYear] = t.[DocumentYear]
and x.[CustomerName] = t.[CustomerName]
and x.[CustomerType] = t.[CustomerType]ъ

в чем суть. выбросы детектируются только для нулевой категории переменной ispromo (всего она имеет две категории 1 и 0)
детектирование простое, все что больше 75% процентиля, то выброс
таким образом для каждой страты(группы) CustomerName+DocumentNum+ItemRelation+DocumentYear нужно
1. найти значение 75% процентиля, и все те, что выше него , то
заменить средними значениями своего дня недели. То есть, вот строчка.

Dt ItemRelation SaleCount DocumentNum DocumentYear2017-10-30 11511 1096 5 2017

Предположим, что 1096 является выбросом(по 75 процентилю), а 2017-10-30 - понедельник, т.е. выброс следует заменить на средние значения по всем понедельникам в таблице. Ниже простой пример, часть таблицы В этом примере понедельники

23.10.2017
30.10.2017
06.11.2017
13.11.2017
20.11.2017

(ispromo = 1, мы не трогаем) среднее значение для понедельников = 276, поэтому 1096 заменить на 276.

также мы делаем с остальными выбросами к дням.

Если значение выброс был во вторник, тогда его следует заменить средними значениями для всего вторника в наборе данных.

Как я могу это сделать sql?

пример данных
Dt ItemRelation SaleCount DocumentNum DocumentYear ispromo20.10.2017 11511 245 5 2017 021.10.2017 11511 232 5 2017 022.10.2017 11511 138 5 2017 023.10.2017 11511 143 5 2017 024.10.2017 11511 245 5 2017 025.10.2017 11511 120 5 2017 026.10.2017 11511 196 5 2017 027.10.2017 11511 364 5 2017 028.10.2017 11511 416 5 2017 029.10.2017 11511 252 5 2017 030.10.2017 11511 1096 5 2017 031.10.2017 11511 1333 5 2017 001.11.2017 11511 999 5 2017 002.11.2017 11511 683 5 2017 003.11.2017 11511 429 5 2017 004.11.2017 11511 1935 5 2017 005.11.2017 11511 50 5 2017 006.11.2017 11511 617 5 2017 007.11.2017 11511 415 5 2017 008.11.2017 11511 91 5 2017 009.11.2017 11511 129 5 2017 010.11.2017 11511 238 5 2017 011.11.2017 11511 156 5 2017 012.11.2017 11511 20 5 2017 013.11.2017 11511 122 5 2017 014.11.2017 11511 -7 5 2017 015.11.2017 11511 85 5 2017 016.11.2017 11511 162 5 2017 017.11.2017 11511 184 5 2017 018.11.2017 11511 239 5 2017 019.11.2017 11511 0 5 2017 020.11.2017 11511 222 5 2017 021.11.2017 11511 116 5 2017 022.11.2017 11511 107 5 2017 023.11.2017 11511 178 5 2017 024.11.2017 11511 258 5 2017 125.11.2017 11511 343 5 2017 126.11.2017 11511 63 5 2017 127.11.2017 11511 667 5 2017 128.11.2017 11511 1708 5 2017 129.11.2017 11511 1108 5 2017 130.11.2017 11511 841 5 2017 101.12.2017 11511 1256 5 2017 102.12.2017 11511 1037 5 2017 103.12.2017 11511 169 5 2017 104.12.2017 11511 698 5 2017 105.12.2017 11511 532 5 2017 1
...
Рейтинг: 0 / 0
26.06.2018, 05:13
    #39665668
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,
Убедись, что у тебя неделя начинается с понедельника, иначе принудительно задай перед запросом.

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
Declare @t table
(Dt date,
ItemRelation int,
SaleCount int,
DocumentNum int,
DocumentYear int,
ispromo int);
insert into @t values
('20.10.2017', 11511, 245, 5, 2017, 0),
('21.10.2017', 11511, 232, 5, 2017, 0), 
('22.10.2017', 11511, 138, 5, 2017, 0), 
('23.10.2017', 11511, 143, 5, 2017, 0), 
('24.10.2017', 11511, 245, 5, 2017, 0), 
('25.10.2017', 11511, 120, 5, 2017, 0), 
('26.10.2017', 11511, 196, 5, 2017, 0), 
('27.10.2017', 11511, 364, 5, 2017, 0), 
('28.10.2017', 11511, 416, 5, 2017, 0), 
('29.10.2017', 11511, 252, 5, 2017, 0), 
('30.10.2017', 11511, 1096, 5, 2017, 0), 
('31.10.2017', 11511, 1333, 5, 2017, 0), 
('01.11.2017', 11511, 999, 5, 2017, 0), 
('02.11.2017', 11511, 683, 5, 2017, 0), 
('03.11.2017', 11511, 429, 5, 2017, 0), 
('04.11.2017', 11511, 1935, 5, 2017, 0), 
('05.11.2017', 11511, 50, 5, 2017, 0), 
('06.11.2017', 11511, 617, 5, 2017, 0), 
('07.11.2017', 11511, 415, 5, 2017, 0), 
('08.11.2017', 11511, 91, 5, 2017, 0), 
('09.11.2017', 11511, 129, 5, 2017, 0), 
('10.11.2017', 11511, 238, 5, 2017, 0), 
('11.11.2017', 11511, 156, 5, 2017, 0), 
('12.11.2017', 11511, 20, 5, 2017, 0), 
('13.11.2017', 11511, 122, 5, 2017, 0), 
('14.11.2017', 11511, -7, 5, 2017, 0), 
('15.11.2017', 11511, 85, 5, 2017, 0), 
('16.11.2017', 11511, 162, 5, 2017, 0), 
('17.11.2017', 11511, 184, 5, 2017, 0), 
('18.11.2017', 11511, 239, 5, 2017, 0), 
('19.11.2017', 11511, 0, 5, 2017, 0), 
('20.11.2017', 11511, 222, 5, 2017, 0), 
('21.11.2017', 11511, 116, 5, 2017, 0), 
('22.11.2017', 11511, 107, 5, 2017, 0), 
('23.11.2017', 11511, 178, 5, 2017, 0), 
('24.11.2017', 11511, 258, 5, 2017, 1), 
('25.11.2017', 11511, 343, 5, 2017, 1), 
('26.11.2017', 11511, 63, 5, 2017, 1), 
('27.11.2017', 11511, 667, 5, 2017, 1), 
('28.11.2017', 11511, 1708, 5, 2017, 1), 
('29.11.2017', 11511, 1108, 5, 2017, 1), 
('30.11.2017', 11511, 841, 5, 2017, 1), 
('01.12.2017', 11511, 1256, 5, 2017, 1), 
('02.12.2017', 11511, 1037, 5, 2017, 1), 
('03.12.2017', 11511, 169, 5, 2017, 1), 
('04.12.2017', 11511, 698, 5, 2017, 1), 
('05.12.2017', 11511, 532, 5, 2017, 1);

with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over () as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Select * From CTE
Where  PERCENTILE < SaleCount
and datePart(WEEKDAY,Dt) < 5
and ispromo = 0;


with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over () as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Update a 
Set SaleCount = cte.AVG_WeekDay
From CTE
join @t a on a.Dt = cte.dt and a.ItemRelation=cte.ItemRelation and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0	;
...
Рейтинг: 0 / 0
26.06.2018, 14:14
    #39666026
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kopelly , благодарю Вас
но есть вопрос
делаю как вы, сначала объявляю табличную переменную

Declare @t table
(Dt date,
ItemRelation int,
SaleCount int,
DocumentNum int,
DocumentYear int,
ispromo int);


select * from @t

Сообщение 1087, уровень 15, состояние 2, строка 58
Необходимо объявить табличную переменную "@t".
не понимаю в чем дело, она же объявлена как табличная, а значится локальной
что тут сделать нужно?
...
Рейтинг: 0 / 0
26.06.2018, 14:18
    #39666029
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,

Код: sql
1.
2.
3.
4.
Сообщение 1087, уровень 15, состояние 2, строка 58
Необходимо объявить табличную переменную "@t".
не понимаю в чем дело, она же объявлена как табличная, а значится локальной
что тут сделать нужно?


выполнять одним пакетом
...
Рейтинг: 0 / 0
26.06.2018, 14:23
    #39666035
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
TaPaK , вы имеете ввиду выполнить весь запрос сразу?
я пробывал

итак запускаем скрипт весь, что Kopelly предоставил, за что я ему сильно благодарен

тут такие ошибки
Сообщение 319, уровень 15, состояние 1, строка 60
Неправильный синтаксис около ключевого слова "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.
Сообщение 10762, уровень 15, состояние 1, строка 62
Функция PERCENTILE_CONT запрещена в текущем режиме совместимости. Она разрешена только в режиме 110 и выше.
Сообщение 10762, уровень 15, состояние 1, строка 73
Функция PERCENTILE_CONT запрещена в текущем режиме совместимости. Она разрешена только в режиме 110 и выше.

что я не правильно делаю?
...
Рейтинг: 0 / 0
26.06.2018, 14:25
    #39666039
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,

или между declare @t и select * from @t стоит go,
или Вы выделили мышкой только часть скрипта - как раз ту, что с select, и нажали F5.
...
Рейтинг: 0 / 0
26.06.2018, 14:27
    #39666041
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,

;with - перед with точка с запятой должна стоять в обязательном порядке.
...
Рейтинг: 0 / 0
26.06.2018, 14:35
    #39666049
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
точка с запятой около with решила проблему первой строчки

вторые две маячат

Сообщение 10762, уровень 15, состояние 1, строка 62
Функция PERCENTILE_CONT запрещена в текущем режиме совместимости. Она разрешена только в режиме 110 и выше.
Сообщение 10762, уровень 15, состояние 1, строка 73
Функция PERCENTILE_CONT запрещена в текущем режиме совместимости. Она разрешена только в режиме 110 и выше.

логично предположить, что тут дело в каком -то режиме
Как узнать что у меня за режим?
как сделать так .чтобы в нем все работало?
Если никак , то как перевести в 110 режим
я не админю sql сервер
но работаюьт ssms 17
...
Рейтинг: 0 / 0
26.06.2018, 14:38
    #39666052
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,

авторя не админю sql сервер
но работаюьт ssms 17

нет, вы ничего не делаете. Позовите взрослых.
...
Рейтинг: 0 / 0
26.06.2018, 15:01
    #39666065
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
дождешься тут взрослых...
тогда пару вопросов
ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = 120

это безопасная процедура, мир не взорвется, если я попробую сам это сделать?


если небезопасная, есть ли альтернатива

PERCENTILE_CONT function
...
Рейтинг: 0 / 0
26.06.2018, 15:09
    #39666067
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
set dateformat dmy;
Declare @t table
(Dt date,
ItemRelation int,
SaleCount int,
DocumentNum int,
DocumentYear int,
ispromo int);
insert into @t values
('20.10.2017', 11511, 245, 5, 2017, 0),
('21.10.2017', 11511, 232, 5, 2017, 0), 
('22.10.2017', 11511, 138, 5, 2017, 0), 
('23.10.2017', 11511, 143, 5, 2017, 0), 
('24.10.2017', 11511, 245, 5, 2017, 0), 
('25.10.2017', 11511, 120, 5, 2017, 0), 
('26.10.2017', 11511, 196, 5, 2017, 0), 
('27.10.2017', 11511, 364, 5, 2017, 0), 
('28.10.2017', 11511, 416, 5, 2017, 0), 
('29.10.2017', 11511, 252, 5, 2017, 0), 
('30.10.2017', 11511, 1096, 5, 2017, 0), 
('31.10.2017', 11511, 1333, 5, 2017, 0), 
('01.11.2017', 11511, 999, 5, 2017, 0), 
('02.11.2017', 11511, 683, 5, 2017, 0), 
('03.11.2017', 11511, 429, 5, 2017, 0), 
('04.11.2017', 11511, 1935, 5, 2017, 0), 
('05.11.2017', 11511, 50, 5, 2017, 0), 
('06.11.2017', 11511, 617, 5, 2017, 0), 
('07.11.2017', 11511, 415, 5, 2017, 0), 
('08.11.2017', 11511, 91, 5, 2017, 0), 
('09.11.2017', 11511, 129, 5, 2017, 0), 
('10.11.2017', 11511, 238, 5, 2017, 0), 
('11.11.2017', 11511, 156, 5, 2017, 0), 
('12.11.2017', 11511, 20, 5, 2017, 0), 
('13.11.2017', 11511, 122, 5, 2017, 0), 
('14.11.2017', 11511, -7, 5, 2017, 0), 
('15.11.2017', 11511, 85, 5, 2017, 0), 
('16.11.2017', 11511, 162, 5, 2017, 0), 
('17.11.2017', 11511, 184, 5, 2017, 0), 
('18.11.2017', 11511, 239, 5, 2017, 0), 
('19.11.2017', 11511, 0, 5, 2017, 0), 
('20.11.2017', 11511, 222, 5, 2017, 0), 
('21.11.2017', 11511, 116, 5, 2017, 0), 
('22.11.2017', 11511, 107, 5, 2017, 0), 
('23.11.2017', 11511, 178, 5, 2017, 0), 
('24.11.2017', 11511, 258, 5, 2017, 1), 
('25.11.2017', 11511, 343, 5, 2017, 1), 
('26.11.2017', 11511, 63, 5, 2017, 1), 
('27.11.2017', 11511, 667, 5, 2017, 1), 
('28.11.2017', 11511, 1708, 5, 2017, 1), 
('29.11.2017', 11511, 1108, 5, 2017, 1), 
('30.11.2017', 11511, 841, 5, 2017, 1), 
('01.12.2017', 11511, 1256, 5, 2017, 1), 
('02.12.2017', 11511, 1037, 5, 2017, 1), 
('03.12.2017', 11511, 169, 5, 2017, 1), 
('04.12.2017', 11511, 698, 5, 2017, 1), 
('05.12.2017', 11511, 532, 5, 2017, 1);


with Numbered as  
(
Select 1.0*row_number() over(Order by SaleCount)/count(*) over() as Num,* From @t
),
Procentile as (
Select top 1 SaleCount From Numbered Where Num <=0.75 Order by SaleCount desc 
 union all
Select top 1 SaleCount From Numbered Where Num >=0.75 Order by SaleCount ),
cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
(Select avg(SaleCount) From Procentile) as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Select * From CTE
Where  PERCENTILE < SaleCount
and datePart(WEEKDAY,Dt) < 5
and ispromo = 0;

with Numbered as  
(
Select 1.0*row_number() over(Order by SaleCount)/count(*) over() as Num,* From @t
),
Procentile as (
Select top 1 SaleCount From Numbered Where Num <=0.75 Order by SaleCount desc 
 union all
Select top 1 SaleCount From Numbered Where Num >=0.75 Order by SaleCount ),
cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
(Select avg(SaleCount) From Procentile) as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Update a 
Set SaleCount = cte.AVG_WeekDay
From CTE
join @t a on a.Dt = cte.dt and a.ItemRelation=cte.ItemRelation and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0	;
...
Рейтинг: 0 / 0
26.06.2018, 16:26
    #39666117
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kopelly , очень и очень круто, читаю твой код и учусь , хотя до тебя еще далеко.
хочу уточнить только
SELECT t.*
FROM
( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType FROM [Action].[dbo].[promo_data]
where [IsPromo] = 1 group by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType having count(*) >=5 ) as x
left outer join [Action].[dbo].[promo_data] as t on x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum]
and x.[DocumentYear] = t.[DocumentYear]
and x.[CustomerName] = t.[CustomerName]
and x.[CustomerType] = t.[CustomerType]

это код выбирает страты, только где больше или равно 5 наблюдений по ispromo=1 (Прости меня пожалуйста, я забыл правильно написать
CustomerType having count(*)[ b] >=5 [/b]) )
пример
магазин-рога-и-копыта+кока-кола+11+2018+розница имеет пять наблюдений по ispromo =1
для наглядности

магзин товар номер год тип магаза salecount ispromoмагазин-рога-и-копыта кока-кола 11 2018 розница 24 0магазин-рога-и-копыта кока-кола 11 2018 розница 25 0магазин-рога-и-копыта кока-кола 11 2018 розница 26 0магазин-рога-и-копыта кока-кола 11 2018 розница 27 0магазин-рога-и-копыта кока-кола 11 2018 розница 28 0магазин-рога-и-копыта кока-кола 11 2018 розница 29 0магазин-рога-и-копыта кока-кола 11 2018 розница 547 1магазин-рога-и-копыта кока-кола 11 2018 розница 457 1магазин-рога-и-копыта кока-кола 11 2018 розница 43 1магазин-рога-и-копыта кока-кола 11 2018 розница 347 1магазин-рога-и-копыта кока-кола 11 2018 розница 236 1


тут у нас страта где есть 5 наблюдений по salecount по ispromo=1

с ней мы работаем, (по этой страте для нулей по ispromo заменяем выбросы)

но с такой стратой мы не работаем
магзин товар номер год тип магаза salecount ispromoмагазин-рога-и-копыта кока-кола 11 2018 розница 24 0магазин-рога-и-копыта кока-кола 11 2018 розница 25 0магазин-рога-и-копыта кока-кола 11 2018 розница 26 0магазин-рога-и-копыта кока-кола 11 2018 розница 27 0магазин-рога-и-копыта кока-кола 11 2018 розница 28 0магазин-рога-и-копыта кока-кола 11 2018 розница 29 0магазин-рога-и-копыта кока-кола 11 2018 розница 547 1магазин-рога-и-копыта кока-кола 11 2018 розница 457 1
тут всего два наблюдения по ispromo=1, следовательно выбросы по ispromo=0 не заменяем согласно тому условию, которое я писал

Как сделать мне замену выбросов только для страт более 5 наблюдений по ispromo=1,

Я моя вина, что я сразу не обратил внимание.
...
Рейтинг: 0 / 0
26.06.2018, 16:30
    #39666123
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
KontoxALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = 120
это безопасная процедура, мир не взорвется, если я попробую сам это сделать?

В результате все имеющиеся хранимки и запросы будут перекомпилированы.

См. документацию, секцию Различия между уровнем 120 и более низкими уровнями совместимости :
"Приложения, перенесенные из предыдущих версий SQL Server, необходимо тщательно тестировать , чтобы убедиться в сохранении или повышении их производительности. Если производительность снизилась, можно задать уровень совместимости базы данных равным 110 или предыдущему значению для использования методологии оптимизатора запросов из прежних версий."
...
Рейтинг: 0 / 0
26.06.2018, 18:18
    #39666182
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Проблема в том, что взрослых нет рядом:( И Фиг знает где они. Не дозвониться.
Хотя написал им. Но Kopelly дал суперское решение ,которое не требует функции PERCENTILE_CONT
единственное я виноват, сразу не сказал, что нужно для страт(групп), где >=5-ти по ispromo=1
для таких наблюдений, чистятся выбросы по ispromo=0, для переменной salecount.
Мой косяк.:(
...
Рейтинг: 0 / 0
27.06.2018, 04:36
    #39666269
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,
Количество IsPromo больше или равно 5 должно быть подряд или просто в периоде?
...
Рейтинг: 0 / 0
27.06.2018, 04:51
    #39666270
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Если не нужно подряд, то:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over () as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay,
Sum(IsPromo) over () as IsPromoCount

From @t)
Update a 
Set SaleCount = cte.AVG_WeekDay
From CTE
join @t a on a.Dt = cte.dt and a.ItemRelation=cte.ItemRelation and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0
and CTE.IsPromoCount >= 5
...
Рейтинг: 0 / 0
27.06.2018, 10:49
    #39666389
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kopelly , подскажи, пожалуйста, а как мне это изменить в твоем коде, где ты без функции percentile count сделал?
так как пока апдейта нет со стороны админов.
...
Рейтинг: 0 / 0
27.06.2018, 10:59
    #39666397
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kontox,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with Numbered as  
(
Select 1.0*row_number() over(Order by SaleCount)/count(*) over() as Num,* From @t
),
Procentile as (
Select top 1 SaleCount From Numbered Where Num <=0.75 Order by SaleCount desc 
 union all
Select top 1 SaleCount From Numbered Where Num >=0.75 Order by SaleCount ),
cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
(Select avg(SaleCount) From Procentile) as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay,
Sum(IsPromo) over () as IsPromoCount
From @t)
Update a 
Set SaleCount = cte.AVG_WeekDay
From CTE
join @t a on a.Dt = cte.dt and a.ItemRelation=cte.ItemRelation and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0	
and CTE.IsPromoCount >= 5;
...
Рейтинг: 0 / 0
27.06.2018, 15:48
    #39666638
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
Kopelly ,все супер и быстро сработало. Последний вопрос остался и всё.

смотри

Dt ItemRelation SaleCount DocumentNum DocumentYear ispromo23.10.2017 11511 143 5 2017 030.10.2017 11511 1096 5 2017 006.11.2017 11511 617 5 2017 013.11.2017 11511 122 5 2017 020.11.2017 11511 222 5 2017 027.11.2017 11511 667 5 2017 104.12.2017 11511 698 5 2017 1

он сосчитал среднее по понедельникам в том числа и для ispromo=1 тогда верно , что 509
но нужно считать среднее по понедельникам только для ispromo=0, тогда будет 276



Можешь плиз поправить с учетом этого. и всё тема закрыта
...
Рейтинг: 0 / 0
27.06.2018, 16:26
    #39666692
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
ещё момент и критичный
скрипт не считает выбросы внутри страт, он заменяет их по всем понедельникам.
К примеру
у нас 4 наблюдений
и всего 4 страты
рога-и-копыта+кока-кола+11333+2017
максидом+диван+11334+2018
рога-и-копыта+лимонад+11335+2018
икея+стул+24234+2018

операция скрипта должна быть проделана внутри каждой страты отдельно
сейчас берется среднее по всем понедельникам всех страт сразу и выбросы так заменяются.
А надо внутри каждой страты отдельно.
...
Рейтинг: 0 / 0
27.06.2018, 16:42
    #39666703
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
1000 наблюдений и по 4 стратам
...
Рейтинг: 0 / 0
27.06.2018, 17:22
    #39666732
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
я все таки апдейтил до 120 sql
этот код заработал

with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over () as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Select * From CTE
Where PERCENTILE < SaleCount
and datePart(WEEKDAY,Dt) < 5
and ispromo = 0;


with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over () as PERCENTILE,
avg(SaleCount) over (Partition by datePart(WEEKDAY,Dt)) as AVG_WeekDay
From @t)
Update a
Set SaleCount = cte.AVG_WeekDay
From CTE
join @t a on a.Dt = cte.dt and a.ItemRelation=cte.ItemRelation and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0 ;

но все равно он не считает и не заменяет выбросы внутри страты отдельно.
...
Рейтинг: 0 / 0
27.06.2018, 17:29
    #39666736
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
для проверки тут уже 2 страты
11511 245 5 2017
и
11706 107 50 2017

Dt ItemRelation SaleCount DocumentNum DocumentYear IsPromo2017-10-20 00:00:00.000 11511 245 5 2017 02017-10-21 00:00:00.000 11511 232 5 2017 02017-10-22 00:00:00.000 11511 138 5 2017 02017-10-23 00:00:00.000 11511 143 5 2017 02017-10-24 00:00:00.000 11511 245 5 2017 02017-10-25 00:00:00.000 11511 120 5 2017 02017-10-26 00:00:00.000 11511 196 5 2017 02017-10-27 00:00:00.000 11511 364 5 2017 02017-10-28 00:00:00.000 11511 416 5 2017 02017-10-29 00:00:00.000 11511 252 5 2017 02017-10-30 00:00:00.000 11511 1096 5 2017 02017-10-31 00:00:00.000 11511 1333 5 2017 02017-11-01 00:00:00.000 11511 999 5 2017 02017-11-02 00:00:00.000 11511 683 5 2017 02017-11-03 00:00:00.000 11511 429 5 2017 02017-11-04 00:00:00.000 11511 1935 5 2017 02017-11-05 00:00:00.000 11511 50 5 2017 02017-11-06 00:00:00.000 11511 617 5 2017 02017-11-07 00:00:00.000 11511 415 5 2017 02017-11-08 00:00:00.000 11511 91 5 2017 02017-11-09 00:00:00.000 11511 129 5 2017 02017-11-10 00:00:00.000 11511 238 5 2017 02017-11-11 00:00:00.000 11511 156 5 2017 02017-11-12 00:00:00.000 11511 20 5 2017 02017-11-13 00:00:00.000 11511 122 5 2017 02017-11-14 00:00:00.000 11511 -7 5 2017 02017-11-15 00:00:00.000 11511 85 5 2017 02017-11-16 00:00:00.000 11511 162 5 2017 02017-11-17 00:00:00.000 11511 184 5 2017 02017-11-18 00:00:00.000 11511 239 5 2017 02017-11-19 00:00:00.000 11511 0 5 2017 02017-11-20 00:00:00.000 11511 222 5 2017 02017-11-21 00:00:00.000 11511 116 5 2017 02017-11-22 00:00:00.000 11511 107 5 2017 02017-11-23 00:00:00.000 11511 178 5 2017 02017-11-24 00:00:00.000 11511 258 5 2017 12017-11-25 00:00:00.000 11511 343 5 2017 12017-11-26 00:00:00.000 11511 63 5 2017 12017-11-27 00:00:00.000 11511 667 5 2017 12017-11-28 00:00:00.000 11511 1708 5 2017 12017-11-29 00:00:00.000 11511 1108 5 2017 12017-11-30 00:00:00.000 11511 841 5 2017 12017-12-01 00:00:00.000 11511 1256 5 2017 12017-12-02 00:00:00.000 11511 1037 5 2017 12017-12-03 00:00:00.000 11511 169 5 2017 12017-12-04 00:00:00.000 11511 698 5 2017 12017-12-05 00:00:00.000 11511 532 5 2017 12017-10-19 00:00:00.000 11706 39 50 2017 02017-10-20 00:00:00.000 11706 47 50 2017 02017-10-21 00:00:00.000 11706 56 50 2017 02017-10-22 00:00:00.000 11706 23 50 2017 02017-10-23 00:00:00.000 11706 37 50 2017 02017-10-24 00:00:00.000 11706 33 50 2017 02017-10-25 00:00:00.000 11706 22 50 2017 02017-10-26 00:00:00.000 11706 35 50 2017 02017-10-27 00:00:00.000 11706 82 50 2017 02017-10-28 00:00:00.000 11706 68 50 2017 02017-10-29 00:00:00.000 11706 28 50 2017 02017-10-30 00:00:00.000 11706 67 50 2017 02017-10-31 00:00:00.000 11706 93 50 2017 02017-11-01 00:00:00.000 11706 73 50 2017 02017-11-02 00:00:00.000 11706 388 50 2017 02017-11-03 00:00:00.000 11706 358 50 2017 02017-11-04 00:00:00.000 11706 325 50 2017 02017-11-05 00:00:00.000 11706 159 50 2017 02017-11-06 00:00:00.000 11706 269 50 2017 02017-11-07 00:00:00.000 11706 169 50 2017 02017-11-08 00:00:00.000 11706 148 50 2017 02017-11-09 00:00:00.000 11706 61 50 2017 02017-11-10 00:00:00.000 11706 72 50 2017 02017-11-11 00:00:00.000 11706 68 50 2017 02017-11-12 00:00:00.000 11706 41 50 2017 02017-11-13 00:00:00.000 11706 28 50 2017 02017-11-14 00:00:00.000 11706 69 50 2017 02017-11-15 00:00:00.000 11706 35 50 2017 02017-11-16 00:00:00.000 11706 38 50 2017 02017-11-17 00:00:00.000 11706 59 50 2017 02017-11-18 00:00:00.000 11706 60 50 2017 02017-11-19 00:00:00.000 11706 35 50 2017 02017-11-20 00:00:00.000 11706 36 50 2017 02017-11-21 00:00:00.000 11706 53 50 2017 02017-11-22 00:00:00.000 11706 33 50 2017 02017-11-23 00:00:00.000 11706 32 50 2017 12017-11-24 00:00:00.000 11706 91 50 2017 12017-11-25 00:00:00.000 11706 99 50 2017 12017-11-26 00:00:00.000 11706 45 50 2017 12017-11-27 00:00:00.000 11706 57 50 2017 12017-11-28 00:00:00.000 11706 128 50 2017 12017-11-29 00:00:00.000 11706 66 50 2017 12017-11-30 00:00:00.000 11706 336 50 2017 12017-12-01 00:00:00.000 11706 294 50 2017 12017-12-02 00:00:00.000 11706 276 50 2017 12017-12-03 00:00:00.000 11706 117 50 2017 12017-12-04 00:00:00.000 11706 141 50 2017 12017-12-05 00:00:00.000 11706 107 50 2017 12017-12-06 00:00:00.000 11706 64 50 2017 1
...
Рейтинг: 0 / 0
27.06.2018, 19:15
    #39666797
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
для проверки тут уже 2 страты
11511 5 2017
и
11706 50 2017
...
Рейтинг: 0 / 0
27.06.2018, 20:31
    #39666816
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена выбросов средними значениями дней недели в sql
для удобства ввел сам данные в проверяющую панель
http://www.sqlfiddle.com/#!18/6b2ef
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена выбросов средними значениями дней недели в sql / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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