SQLize Online / PHPize Online  /  SQLtest Online

A A A
Share      Blog   Popular
Copy Format Clear
/*Создаём таблицу*/ create table t1 (fio varchar(40), data date, ostatok integer); /*Наполняем данными; предположение - данные есть на каждую дату*/ insert into t1 values ('Иванов', '2021-01-01', 1000), ('Иванов', '2021-01-02', 1000), ('Иванов', '2021-01-03', 800), ('Иванов', '2021-01-04', 700), ('Иванов', '2021-01-05', 700), ('Степанов', '2021-01-01', 2000), ('Степанов', '2021-01-02', 3000), ('Степанов', '2021-01-03', 3000), ('Степанов', '2021-01-04', 2000), ('Степанов', '2021-01-05', 3000), ('Еленина', '2021-01-01', 1500), ('Еленина', '2021-01-02', 1500), ('Еленина', '2021-01-03', 1500), ('Еленина', '2021-01-04', 1500), ('Еленина', '2021-01-05', 1500); /*Смотрим таблицу*/ select * from t1 order by fio, data; /*Создаём новую таблицу*/ create table t2 as (select t1.fio, t1.ostatok, t1.data start_date, cast(coalesce(lead(t1.data) over ( partition by t1.fio order by t1.data asc ) - INTERVAL '1 day', cast('2555-01-01' as date)) as date) finish_date /*Достраиваем дату окончания*/ from ( select t1.fio, t1.data, t1.ostatok, lag(t1.ostatok) over ( partition by t1.fio order by t1.data asc) ostatok_prev /*Смотрим предыдущий остаток*/ from t1 ) t1 where coalesce(t1.ostatok, 0) <> coalesce(t1.ostatok_prev,0) /*Оставляем даты, у которых остатки расходятся*/ ); /*Выводим данные из новой таблицы*/ select * from t2 order by fio, start_date; /*Проверяем, что все значения совпадают*/ select t1.fio, t1.ostatok ostatok_etalon, t2.ostatok ostatok_proverka, t1.data, t2.start_date from t1 left join t2 on t1.fio = t2.fio and t1.data between t2.start_date and t2.finish_date order by t1.fio, t1.data;
Stuck with a problem? Got Error? Ask ChatGPT!
Copy Clear