add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE balance
(
id INTEGER,
balance_date DATETIME,
balance INTEGER,
);
insert into balance values ( 1, '2018-10-01', 111 );
insert into balance values ( 1, '2018-10-02', 115 );
insert into balance values ( 12, '2017-10-01', 1134 );
insert into balance values ( 12, '2017-09-01', 159 );
insert into balance values ( 1, '2018-09-02', 130 );
insert into balance values ( 5, '2018-09-02', 150 );
6 rows affected
select * from balance;
id balance_date balance
1 2018-10-01 00:00:00.000 111
1 2018-10-02 00:00:00.000 115
12 2017-10-01 00:00:00.000 1134
12 2017-09-01 00:00:00.000 159
1 2018-09-02 00:00:00.000 130
5 2018-09-02 00:00:00.000 150
WITH
bal AS (
SELECT
b.*,
row_number() OVER (PARTITION BY id ORDER BY balance_date DESC) r
FROM balance b
),
last_bal AS (
SELECT id, balance_date, balance FROM bal WHERE r = 1
),
prev_bal AS (
SELECT id, balance_date, balance FROM bal WHERE r = 2
)
SELECT
lb.id,
lb.balance_date AS last_balance_date, lb.balance AS last_balance,
pb.balance_date AS prev_balance_date, pb.balance AS prev_balance
FROM last_bal lb
LEFT JOIN prev_bal pb ON pb.id = lb.id
;
id last_balance_date last_balance prev_balance_date prev_balance
1 2018-10-02 00:00:00.000 115 2018-10-01 00:00:00.000 111
5 2018-09-02 00:00:00.000 150 null null
12 2017-10-01 00:00:00.000 1134 2017-09-01 00:00:00.000 159
-- ПОСМОТРИТЕ как работает функция ROW_NUMBER() !!!
SELECT
b.*,
row_number() OVER (PARTITION BY id ORDER BY balance_date DESC) r
FROM balance b
id balance_date balance r
1 2018-10-02 00:00:00.000 115 1
1 2018-10-01 00:00:00.000 111 2
1 2018-09-02 00:00:00.000 130 3
5 2018-09-02 00:00:00.000 150 1
12 2017-10-01 00:00:00.000 1134 1
12 2017-09-01 00:00:00.000 159 2