Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 August 27

Y

Yura in SqlCom.ru - Стиль жизни SQL
Всем привет) Кто может обяснить что такое Cursor и как он работает?
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Yura
Всем привет) Кто может обяснить что такое Cursor и как он работает?
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
кажется, видео для таких вещей - это шиза
а автора вопроса в гугле забанили

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-ver15
там пример внизу есть даже
источник

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Всем привет!
Подскажите какой функцией можно разбить такую таблицу на 3 интервала, где цена товара была
1 интервал = 1
2 интервал = 2
3 интервал снова = 1
?
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Евгений
Всем привет!
Подскажите какой функцией можно разбить такую таблицу на 3 интервала, где цена товара была
1 интервал = 1
2 интервал = 2
3 интервал снова = 1
?
Слабо понятно, что хотите)
источник

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Andrew Komarov
Слабо понятно, что хотите)
Есть таблица с историями цен товаров в каждый момент. Хочу таблицу, в которой будут периоды действия каждой цены.
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Оконными функциями сравнивать предыдущий и последующий (lead или lag(прайс) ордер бай период). Если равны, то ноль, если не равны то единица. Потом  складывайте получившиеся  единицы  с нулями и получаете группы , так же sum( ..) over (order by period)


Если разные айтемы, то в оконных функциях указываете partition by item
источник

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Andrew Komarov
Оконными функциями сравнивать предыдущий и последующий (lead или lag(прайс) ордер бай период). Если равны, то ноль, если не равны то единица. Потом  складывайте получившиеся  единицы  с нулями и получаете группы , так же sum( ..) over (order by period)


Если разные айтемы, то в оконных функциях указываете partition by item
"Потом  складывайте получившиеся  единицы  с нулями и получаете группы"
вот это не понял, как сформировать группы после получения 1 и 0?
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Накопительный итог
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Если у вас предыдущие значение отличается от текущего, то единица, это даст новую группу. Если значения равны, то группа при накопительным итоге не поменяется
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Соответственно sum( знание из этого сравнения) over (order by period)
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Yura
Всем привет) Кто может обяснить что такое Cursor и как он работает?
Курсор -- это цикл по записям, которые возвращаются каким-то запросом.
источник

А

Андрій in SqlCom.ru - Стиль жизни SQL
Проснись ты хропишь
источник

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Andrew Komarov
Соответственно sum( знание из этого сравнения) over (order by period)
Воспользовался вашим советом, вывел сравнение цены со следующей строкой, но что-то непонятно чем эта сумма тут может быть полезна. Поясните?

Вот код для таблицы, даже убрал айтем чтобы было еще проще

CREATE TABLE table_price(
datetime DATETIME,
price INT)

INSERT INTO table_price VALUES ('2020-01-01', 50)
INSERT INTO table_price VALUES ('2020-01-02', 50)
INSERT INTO table_price VALUES ('2020-01-03', 60)
INSERT INTO table_price VALUES ('2020-01-04', 70)
INSERT INTO table_price VALUES ('2020-01-08', 50)
INSERT INTO table_price VALUES ('2020-01-09', 50)
INSERT INTO table_price VALUES ('2020-01-10', 60)


SELECT *, sum(price_is_different) OVER (ORDER BY datetime) strange_sum
FROM (
SELECT datetime, price, lead(price, 1, NULL) OVER (ORDER BY datetime) next_row_price,
CASE WHEN price = lead(price, 1, NULL) OVER (ORDER BY datetime) THEN 0 ELSE 1 END price_is_different
FROM table_price) pre
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Евгений
Воспользовался вашим советом, вывел сравнение цены со следующей строкой, но что-то непонятно чем эта сумма тут может быть полезна. Поясните?

Вот код для таблицы, даже убрал айтем чтобы было еще проще

CREATE TABLE table_price(
datetime DATETIME,
price INT)

INSERT INTO table_price VALUES ('2020-01-01', 50)
INSERT INTO table_price VALUES ('2020-01-02', 50)
INSERT INTO table_price VALUES ('2020-01-03', 60)
INSERT INTO table_price VALUES ('2020-01-04', 70)
INSERT INTO table_price VALUES ('2020-01-08', 50)
INSERT INTO table_price VALUES ('2020-01-09', 50)
INSERT INTO table_price VALUES ('2020-01-10', 60)


SELECT *, sum(price_is_different) OVER (ORDER BY datetime) strange_sum
FROM (
SELECT datetime, price, lead(price, 1, NULL) OVER (ORDER BY datetime) next_row_price,
CASE WHEN price = lead(price, 1, NULL) OVER (ORDER BY datetime) THEN 0 ELSE 1 END price_is_different
FROM table_price) pre
я думал, что вам что-то подобное надобно
источник

KT

Konstantin Taranov in SqlCom.ru - Стиль жизни SQL
Евгений
Воспользовался вашим советом, вывел сравнение цены со следующей строкой, но что-то непонятно чем эта сумма тут может быть полезна. Поясните?

Вот код для таблицы, даже убрал айтем чтобы было еще проще

CREATE TABLE table_price(
datetime DATETIME,
price INT)

INSERT INTO table_price VALUES ('2020-01-01', 50)
INSERT INTO table_price VALUES ('2020-01-02', 50)
INSERT INTO table_price VALUES ('2020-01-03', 60)
INSERT INTO table_price VALUES ('2020-01-04', 70)
INSERT INTO table_price VALUES ('2020-01-08', 50)
INSERT INTO table_price VALUES ('2020-01-09', 50)
INSERT INTO table_price VALUES ('2020-01-10', 60)


SELECT *, sum(price_is_different) OVER (ORDER BY datetime) strange_sum
FROM (
SELECT datetime, price, lead(price, 1, NULL) OVER (ORDER BY datetime) next_row_price,
CASE WHEN price = lead(price, 1, NULL) OVER (ORDER BY datetime) THEN 0 ELSE 1 END price_is_different
FROM table_price) pre
а вы в каком виде результат то хотите? в Excel нарисовать можете по этим тестовым данным?
источник

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Andrew Komarov
я думал, что вам что-то подобное надобно
да, такое и надо, как вы это получили?
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Евгений
да, такое и надо, как вы это получили?
Select Tbl2.GroupID,Tbl2.price, MIN(Tbl2.datetime) MinDT, MAX(Tbl2.datetime) MaxDT  from (
Select datetime,price, SUM(Df) OVER (order by datetime ROWS  UNBOUNDED PRECEDING) GroupID   from (
Select datetime,price, IIF(LAG(price) OVER (order by datetime) = price,0,1) Df  from  table_price)Tbl
)Tbl2
GROUP BY Tbl2.GroupID, Tbl2.price
order by Tbl2.GroupID
источник
2020 August 28

Е

Евгений in SqlCom.ru - Стиль жизни SQL
Andrew Komarov
Select Tbl2.GroupID,Tbl2.price, MIN(Tbl2.datetime) MinDT, MAX(Tbl2.datetime) MaxDT  from (
Select datetime,price, SUM(Df) OVER (order by datetime ROWS  UNBOUNDED PRECEDING) GroupID   from (
Select datetime,price, IIF(LAG(price) OVER (order by datetime) = price,0,1) Df  from  table_price)Tbl
)Tbl2
GROUP BY Tbl2.GroupID, Tbl2.price
order by Tbl2.GroupID
👍🙏
источник

AK

Andrew Komarov in SqlCom.ru - Стиль жизни SQL
Евгений
👍🙏
только тут так
SUM(Df) OVER (order by datetime ROWS  UNBOUNDED PRECEDING) GroupID .


айтем в партишн засунуть можно.
источник