Oracle
 sql >> база данни >  >> RDS >> Oracle

Rank() SQL или нещо подобно

Използвайте LAG аналитична функция:

SELECT "Date",
       GREATEST(
         account_balance - LAG(account_balance, 1, 0) OVER (ORDER BY "Date"),
         0
       ) AS credit,
       GREATEST(
         LAG(account_balance, 1, 0) OVER (ORDER BY "Date") - account_balance,
         0
       ) AS debit,
       account_balance
FROM   table_name

Което за примерните данни:

CREATE TABLE table_name ( "Date", account_balance ) AS
SELECT Date '2021-01-01', +1000 FROM DUAL UNION ALL
SELECT Date '2021-01-02', + 500 FROM DUAL UNION ALL
SELECT Date '2021-01-03', - 200 FROM DUAL;

Изходи:

За да изчислите в обратна посока:

SELECT "Date",
       credit,
       debit,
       SUM(credit-debit) OVER (ORDER BY "Date") AS account_balance
FROM   table_name

Което за примерните данни:

CREATE TABLE table_name ( "Date", credit, debit ) AS
SELECT Date '2021-01-01', 1000,   0 FROM DUAL UNION ALL
SELECT Date '2021-01-02',    0, 500 FROM DUAL UNION ALL
SELECT Date '2021-01-03',    0, 700 FROM DUAL;

Изходи:

db<>fiddle тук




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle връща същия псевдоним за различни случаи при избор

  2. ORA-12514 TNS:слушателят в момента не знае за услуга, поискана в дескриптора на свързване

  3. Oracle 10g рекурсивна заявка

  4. Динамична заявка за PIVOT In Clause

  5. как да обедините две таблици, за да получите последните нови редове от таблица 2 и останалите от таблица 1