powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / медиана за место avg()
11 сообщений из 11, страница 1 из 1
медиана за место avg()
    #39668495
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, плиз поправить запрос
;with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by CustomerType,[CustomerName],ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
avg(SaleCount) over (Partition by CustomerType, [CustomerName], ItemRelation, DocumentNum, DocumentYear,datePart(WEEKDAY,Dt), IsPromo) as AVG_WeekDay
From promo_data_copy)
Update a
Set SaleCount = cte.AVG_WeekDay
From CTE
join promo_data_copy a
on a.Dt = cte.dt
and a.ItemRelation=cte.ItemRelation
and a.CustomerName=cte.CustomerName
and a.DocumentNum = cte.DocumentNum
and a.DocumentYear = cte.DocumentYear
and a.CustomerType = cte.CustomerType
and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 7
and CTE.ispromo = 0 ;

как вместо avg() сделать median()
там такой функции нет
запрос сейчас выбросы заменяет средними значениями по тому или иному дню, но лучше это делать по медиане
но как в экселе там нет такой функции.
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668498
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так делать не помогает

;with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by CustomerType,[CustomerName],ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY SaleCount) over (Partition by CustomerType, [CustomerName], ItemRelation, DocumentNum, DocumentYear,
datePart(WEEKDAY,Dt), IsPromo) as median

From promo_data_copy2)
Update a
Set SaleCount = cte.median
From CTE
join promo_data_copy a
on a.Dt = cte.dt
and a.ItemRelation=cte.ItemRelation
and a.CustomerName=cte.CustomerName
and a.DocumentNum = cte.DocumentNum
and a.DocumentYear = cte.DocumentYear
and a.CustomerType = cte.CustomerType
and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 7
and CTE.ispromo = 0 ;

он не заменяет выбросы на медиану дня
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668501
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так сообразил в чем дело, заработало.:)
Как удалить этот пост?
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668621
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontoxзаработало.:)мададца, конечно, только это:
авторPERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY SaleCount) over (Partition by CustomerType, [CustomerName], ItemRelation, DocumentNum, DocumentYear,
datePart(WEEKDAY,Dt), IsPromo) as median
ниразу не медиана ...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
set nocount on
--
declare @t table (v float)
insert into @t values(1.0),(2.0),(3.0),(4.0) --,(5.0)

--	
select
	PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY v) over(partition by (select 1)) as [Это не медиана !]
from @t

;with cte as (
	select
		v
		,rnAsc	=row_number()over(order by v)
		,rnDesc	=row_number()over(order by v desc)
	from @t)

select
	avg(v) as [Это медиана]
from cte 
where rnAsc in (rnDesc,rnDesc-1,rnDesc+1)


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Это не медиана !
----------------------
2
2
2
2

Это медиана
----------------------
2,5
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668630
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

зависит от требований. По вашей притензии PERCENTILE_CONT
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668705
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court , интересное замечание, а как мне ваш код в свой интегрировать?
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668710
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontoxcourt , интересное замечание, а как мне ваш код в свой интегрировать?не нужно ничего интегрировать

TaPaK , тут 21538540 лучше вариант предложил, - просто измените PERCENTILE_DISC на PERCENTILE_CONT и результат будет правильный
...
Рейтинг: 0 / 0
медиана за место avg()
    #39668723
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontoxcourt , интересное замечание, а как мне ваш код в свой интегрировать?
т.е. описание что же делает команда мы не будем... впрочем ничего нового
...
Рейтинг: 0 / 0
медиана за место avg()
    #39669073
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как просил модератор, не буду плодить темы, все в одной.
все подпилиываю этот код

;with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_cont(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by CustomerType,[CustomerName],ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY SaleCount) over (Partition by CustomerType, [CustomerName],
ItemRelation, DocumentNum, DocumentYear,
datePart(WEEKDAY,Dt), IsPromo) as median
From promo_data_copy2)
Update a
Set SaleCount = cte.median
From CTE
join promo_data_copy2 a
on a.Dt = cte.dt
and a.ItemRelation=cte.ItemRelation
and a.CustomerName=cte.CustomerName
and a.DocumentNum = cte.DocumentNum
and a.DocumentYear = cte.DocumentYear
and a.CustomerType = cte.CustomerType
and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 7
and CTE.ispromo = 0 ;

его шаги
* есть переменная ispromo, она принимает или 1 или 0
код должен работать с нулевой категорией

1. высчитать 75 процентиль по всем наблюдениям нулевой категории ispromo по переменной SaleCount
2. все что выше 75 процентиля код должен заменять медианой выбросы тех дней, на который он пришолся

например выброс пришелся на четверг
значит смотрим медиану всех четвергов и заменяем ею выбросный четверг
3. и все это код делает для групп сustomerType+[CustomerName]+
ItemRelation+DocumentNum+DocumentYear
т.е. раздельно для каждой такой группы


но сейчас он что-то не отрабатывает
вот набор данных

желтые исходные данные

зеленые то что он поназакменял
красные это то что по какой то причине не было заменено
подскажите, почему он где-то правильно отработал, а где-то проигнорировал
...
Рейтинг: 0 / 0
медиана за место avg()
    #39669075
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Может, вы еще и тег src освоите наконец?
...
Рейтинг: 0 / 0
медиана за место avg()
    #39669083
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyama, дал мне совет через этот запрос
проверить
Код: 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 cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_cont(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by CustomerType,[CustomerName],ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY SaleCount)  over (Partition by CustomerType, [CustomerName], 
ItemRelation, DocumentNum, DocumentYear,
datePart(WEEKDAY,Dt), IsPromo)  as median
 From promo_data_copy2)

   select 
	a.SaleCount , cte.median
	, CTE.PERCENTILE , CTE.SaleCount -- проверить CTE.PERCENTILE < CTE.SaleCount
	,datePart(WEEKDAY,CTE.Dt)  -- проверить datePart(WEEKDAY,CTE.Dt) < 7
	,CTE.ispromo -- проверить CTE.ispromo = 0 ;
From CTE
join promo_data_copy2 a 
on a.Dt = cte.dt
and a.ItemRelation=cte.ItemRelation 
and a.CustomerName=cte.CustomerName
and a.DocumentNum = cte.DocumentNum 
and a.DocumentYear = cte.DocumentYear 
and a.CustomerType = cte.CustomerType 
and a.ispromo = cte.ispromo
and CTE.ispromo = 0 
where cte.[DocumentNum]=000000999 and cte.[DocumentYear]=2018
  and cte.[ItemRelation]=11683
  order by cte.Dt




Спасибо, разобрался:)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / медиана за место avg()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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