I am not a programmer Ответов: 1

Разных между числовыми рядами


Привет ребята,
Я остановился на одном интересном вопросе.
Я не могу придумать, как найти разницу между рядами.
Задача:
1)для каждого 'id_a' найдите последние 2 строки, где 'amount' <> 0
2)найти разницу между "сумма" этой строки

Например Ресул должен быть таким:

name      | amount  |  id_a  |  difference
Konchita  |    10   |   1    |   0
Bla       |    10   |   1    |   0
Evlampiy  |    1    |   4    |  -9
Zyzia     |    10   |   4    |  -9
...       |   ...   |  ...   |  ...


Я пытался сделать это через функцию windows, но еще больше запутался

Пример таблицы:

create table b(
id_b int not null primary key,
name nvarchar (10) not null,
[date] date not null,
[amount] numeric null,
id_a int not null foreign key references a(id_a) --it is the foreigh key from another table but it does not matter.
)

insert into b(id_b,name,[date],[amount],id_a) values
(1,'Akakiy','2019-03-03','2',1),
(2,'Traktoe','2019-03-03','60',2),
(3,'Himalay','2018-02-02','50',3),
(4,'Evlampiy','2018-02-02','1',4),
(5,'Zyzia','2018-02-02','10',4),
(6,'Borzyn','2018-02-02','100',2),
(7,'Konchita','2018-02-03','10',1),
(8,'Bycia','2018-02-03','0',1),
(9,'Masik','2018-02-03','0',4),
(10,'Bla','2018-02-03','10',1);


Что я уже пробовал:

Я пытался сделать это через функцию windows, но еще больше запутался

1 Ответов

Рейтинг:
1

OriginalGriff

Начните делать это в простые этапы:
1) сгруппируйте вместе значения id_a. Вы не можете сделать это легко с группой BY, но ... вы можете с разделом:

SELECT id_a, 
       id_b, 
       [DATE], 
       Amount,
       RANK() OVER (PARTITION BY id_a ORDER BY [date] DESC, id_b desc) as ranking
From b WHERE Amount != 0

Теперь вы можете выбрать из этого результата нужные вам строки, используя предложение WHERE на ranking колонка.

Это половина твоей домашней работы - остальное я оставляю тебе!