Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Rank() SQL lub coś takiego

Użyj LAG funkcja analityczna:

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

Co dla przykładowych danych:

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;

Wyjścia:

Aby obliczyć w przeciwnym kierunku:

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

Co dla przykładowych danych:

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;

Wyjścia:

db<>fiddle tutaj




  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:Zmiana kolumny VARCHAR2 na CLOB

  2. Obejście dla sprzężenia zewnętrznego z operatorem IN w Oracle

  3. CRS 11.2.0

  4. Jego powiedzenie, że nie mam wybranego wiersza?

  5. Porównywanie wartości oddzielonych przecinkami z dwóch kolumn dwóch różnych tabel