powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть целочисленные значения по заданному условию.
25 сообщений из 25, страница 1 из 1
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #39662597
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

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

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

Если погуглить 30 секунд, то выясняется, что http://www.webmath.ru/poleznoe/formules_18_7.php Целыми числами называются все натуральные числа, все числа противоположные им по знаку и нуль.
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39662646
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну, я просто имел ввиду не нулевые и не отрицательные.
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #39662657
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
они упорядочены по дате , просто столбец с датой, я не вставил, но они идут строго по дате по возрастанию.
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39662658
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. запрос возвращает мне все строго по дате по возрастанию , я проверял
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #39662661
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontoxт.е. запрос возвращает мне все строго по дате по возрастанию , я проверялбез предложения ордер бай - это всего лишь иллюзия, зависящая от плана выполнения запроса. Завтра сервер решит делать реверс-скан по индексу - и вы получите обратный порядок следования строк. А послезавтра ваш админ снесет кластерный индекс в таблице - и вы получите кашу из кучи в результате полного её скана.
но дело ваше...
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39662670
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да такое может быть. в таком случае order by Ispromo.
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39662674
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

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

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

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

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

SELECT CASE WHEN 2 > 1 THEN 3 ELSE 4 END AS test
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #39662794
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly,

тестовые данные, на которых запросы писали, показать можете? почему-то не покидает чувство, что вы всё сделали через чур сложно, с большим количеством лишних вычислений.
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #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
Вернуть целочисленные значения по заданному условию.
    #39662799
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибку нашел: Во всех запросах "and t.SaleCount > 1" нужно исправить на "and t.SaleCount > 0"!
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39662809
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontoxну, я просто имел ввиду не нулевые и не отрицательные.
То есть натуральные
...
Рейтинг: 0 / 0
Вернуть целочисленные значения по заданному условию.
    #39665539
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все ок, отработало, без вас бы не справился
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть целочисленные значения по заданному условию.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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