Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть целочисленные значения по заданному условию. / 25 сообщений из 25, страница 1 из 1
19.06.2018, 17:40
    #39662594
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Подскажите
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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(0-нет, 1 -есть)
Как сделать чтобы если в страте
CustomerName ItemRelation DocumentNum DocumentYear до 4 включительно целочисленных значений по SaleCount по ispromo=1
, то вернуть только пять предшествующих значений по SaleCount по ispromo=0 и не нулей (т.е. тоже целочисленных)
например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SaleCount	IsPromo
9	0
0	0
1	0
4	0
4	0
0	0
4	0
1	1
2	1
0	1
4	1
0	1


тут 3 целочисленных значения по ispromo=1
1,2,4
и надо вернуть до 5 включительно предшествующих значений по ispromo=0, но не нулей (целых значений может быть меньше 5)
т.е.
4,4,4,1,9

если же у нас 5 целочисленных по ispromo=1, то вернуть все значения по ispromo=0
по sale count

Но если у нас по ispromo=0, SaleCount имеет только нули, вернуть все значения страты, внезависимости сколько у нас целочисленных SaleCount по ispromo=1 .
...
Рейтинг: 0 / 0
19.06.2018, 17:44
    #39662597
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

думаю, сегодня вам смело можно вручить "переходящий вымпел дружины" за самое путанное и непонятно объяснение задачи...
...
Рейтинг: 0 / 0
19.06.2018, 17:45
    #39662600
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

и вообще меня удивляет... вроде как по смыслу SaleCount - натуральное число. Как натуральное может быть нецелочисленным. Или про что вы?
...
Рейтинг: 0 / 0
19.06.2018, 18:13
    #39662622
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
целочисленное это не 0 и не отрицательное
-1,-2 уже не подходят
...
Рейтинг: 0 / 0
19.06.2018, 18:53
    #39662645
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontoxцелочисленное это не 0 и не отрицательное
-1,-2 уже не подходятЭто вы сами придумали или подсказал что?

Если погуглить 30 секунд, то выясняется, что http://www.webmath.ru/poleznoe/formules_18_7.php Целыми числами называются все натуральные числа, все числа противоположные им по знаку и нуль.
...
Рейтинг: 0 / 0
19.06.2018, 18:56
    #39662646
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
ну, я просто имел ввиду не нулевые и не отрицательные.
...
Рейтинг: 0 / 0
19.06.2018, 19:14
    #39662653
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

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

9 0
4 1
4 0
2 1
4 0
1 1
4 0
0 1
1 0
0 1
0 0
0 0
...
Рейтинг: 0 / 0
19.06.2018, 19:20
    #39662657
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
они упорядочены по дате , просто столбец с датой, я не вставил, но они идут строго по дате по возрастанию.
...
Рейтинг: 0 / 0
19.06.2018, 19:23
    #39662658
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
т.е. запрос возвращает мне все строго по дате по возрастанию , я проверял
...
Рейтинг: 0 / 0
19.06.2018, 19:24
    #39662659
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

окау. идем дальше....
такие ситуации возможны:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
9	0
0	0
1	0
4	0
4	0
0	0
4	0
1	1
2	1
0	1
4	1
0	1
9	0
0	0
1	0
4	0
4	0
0	0
4	0
1	1
2	1
0	1
4	1
0	1
как в этом случае обрабатывать чередующиеся группы ? с какого конца в принципе начинается "анализ данных" - сверху? Снизу? С первой группы с промо 0? С первой группы с промо 1?
Понимаете, насколько расплывчато вы сформулировали условия своей хотелки...
...
Рейтинг: 0 / 0
19.06.2018, 19:26
    #39662661
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontoxт.е. запрос возвращает мне все строго по дате по возрастанию , я проверялбез предложения ордер бай - это всего лишь иллюзия, зависящая от плана выполнения запроса. Завтра сервер решит делать реверс-скан по индексу - и вы получите обратный порядок следования строк. А послезавтра ваш админ снесет кластерный индекс в таблице - и вы получите кашу из кучи в результате полного её скана.
но дело ваше...
...
Рейтинг: 0 / 0
19.06.2018, 19:40
    #39662670
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Да такое может быть. в таком случае order by Ispromo.
...
Рейтинг: 0 / 0
19.06.2018, 19:47
    #39662674
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

а первый столбец как? или порядок тут неважен? что тогда понимается под "предшествующими" значениями из стартового поста?
...
Рейтинг: 0 / 0
19.06.2018, 19:51
    #39662677
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
а первый столбец как? или порядок тут неважен? что тогда понимается под "предшествующими" значениями из стартового поста?

страта должна идти
CustomerName ItemRelation DocumentNum DocumentYear

предыдущие, это предыдущие значения по salecount по ispromo=0
т.е. за пять значений, пока не начнется категория ispromo=1
...
Рейтинг: 0 / 0
19.06.2018, 20:22
    #39662688
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

тогда, всё что вам нужно - это CASE и SUM() OVER(PARTITION BY ... ORDER BY ...) (Если версия сервера позволяет - 2012 и выше)
...
Рейтинг: 0 / 0
19.06.2018, 20:34
    #39662693
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
про case when я подозревал,но не понимаю как эту конструкцию в запрос вставить. Можете показать?
...
Рейтинг: 0 / 0
20.06.2018, 00:12
    #39662742
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontox,

SELECT CASE WHEN 2 > 1 THEN 3 ELSE 4 END AS test
...
Рейтинг: 0 / 0
20.06.2018, 05:26
    #39662780
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
              Outer apply(Select top 5 * From [Action].[dbo].[promo_data] as t 
                                Where  x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum] 
                                     and x.[DocumentYear] = t.[DocumentYear]
                                     and x.[CustomerName] = t.[CustomerName]
                                     and x.[CustomerType] = t.[CustomerType]
                                     and t.[IsPromo] = 0) t
...
Рейтинг: 0 / 0
20.06.2018, 06:25
    #39662787
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
С проверкой на цепочку IsPromo = 1 (от 4 штук) и выбирает до 5 пяти предыдущих IsPromo = 0 (если в предыдущих встречается IsPromo = 1, более ранние не берет):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Select t.* From (
Select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType,
sum(cast(IsPromo as int)) over (Partition by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType Order by Date rows 3 FOLLOWING) as MinPromoNext,
lag(IsPromo) over (Partition by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType Order by Date ) as ForCheckStartPormo
From @promo_data) x
cross apply (
Select top 5 *,
          max(t.IsPromo) over (Order by Date RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)  as FollowingMaxPromo
  From @promo_data t
Where t.CustomerName=x.CustomerName
and t.[ItemRelation]=x.[ItemRelation]
and t.[DocumentNum]=x.[DocumentNum]
and t.[DocumentYear]=x.[DocumentYear]
and t.CustomerType=x.CustomerType
and t.Date< x.StartPromo
and t.SaleCount > 1
Order by t.Date desc) t
Where x.SumPromoNext = 4 
    and x.ForCheckStartPormo = 0 
    and t.FollowingMaxPromo = 0
...
Рейтинг: 0 / 0
20.06.2018, 06:31
    #39662791
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Если длина цепочки IsPromo=1 должна быть <=4:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Select t.* From (
Select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType,IsPromo,
Min(IsPromo) over (Partition by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType Order by Date rows 4 FOLLOWING) as MinPromoNext,
lag(IsPromo) over (Partition by CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],CustomerType Order by Date ) as ForCheckStartPormo
From @promo_data) x
cross apply (
Select top 5 *,
          max(t.IsPromo) over (Order by Date RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)  as FollowingMaxPromo
  From @promo_data t
Where t.CustomerName=x.CustomerName
and t.[ItemRelation]=x.[ItemRelation]
and t.[DocumentNum]=x.[DocumentNum]
and t.[DocumentYear]=x.[DocumentYear]
and t.CustomerType=x.CustomerType
and t.Date< x.StartPromo
and t.SaleCount > 1
Order by t.Date desc) t
Where x.IsPromo = 1
    and x.MinPromoNext = 0
    and x.ForCheckStartPormo = 0 
    and t.FollowingMaxPromo = 0
...
Рейтинг: 0 / 0
20.06.2018, 06:47
    #39662794
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kopelly,

тестовые данные, на которых запросы писали, показать можете? почему-то не покидает чувство, что вы всё сделали через чур сложно, с большим количеством лишних вычислений.
...
Рейтинг: 0 / 0
20.06.2018, 06:50
    #39662797
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Щукина Анна,
Код: 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.
declare @promo_data table 
(KeyID int,
OrderID int,
SaleCount int,
IsPromo int)

Insert into @promo_data Values 
(1,1,9,0),
(1,2,0,0),
(1,3,1,0),
(1,4,4,1),
(1,5,4,0),
(1,6,0,0),
(1,7,4,0),
(1,8,1,1),
(1,9,2,1),
(1,10,0,1),
(1,11,4,1),
(1,12,4,1),
(1,13,4,0),
(1,14,0,1);

Select * From (
Select KeyID,OrderID,
sum(cast(IsPromo as int)) over (Partition by KeyID Order by OrderID ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) as SumPromoNext,
lag(IsPromo) over (Partition by KeyID Order by OrderID ) as ForCheckStartPormo
From @promo_data) x
cross apply (
Select top 5 *,
max(t.IsPromo) over (Order by OrderID RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)  as FollowingMaxPromo
From @promo_data t
Where t.KeyID = x.KeyID
  and t.OrderID < x.OrderID
  and t.SaleCount > 1
Order by t.OrderID desc
) t
Where x.SumPromoNext = 4 
  and x.ForCheckStartPormo = 0 
  and t.FollowingMaxPromo = 0
...
Рейтинг: 0 / 0
20.06.2018, 06:53
    #39662799
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Ошибку нашел: Во всех запросах "and t.SaleCount > 1" нужно исправить на "and t.SaleCount > 0"!
...
Рейтинг: 0 / 0
20.06.2018, 07:53
    #39662809
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Kontoxну, я просто имел ввиду не нулевые и не отрицательные.
То есть натуральные
...
Рейтинг: 0 / 0
25.06.2018, 19:20
    #39665539
Kontox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть целочисленные значения по заданному условию.
Все ок, отработало, без вас бы не справился
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть целочисленные значения по заданному условию. / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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