sql >> Database >  >> RDS >> Oracle

Rank() SQL Of zoiets

Gebruik de LAG analytische functie:

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

Wat, voor de voorbeeldgegevens:

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;

Uitgangen:

Om in de tegenovergestelde richting te berekenen:

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

Wat, voor de voorbeeldgegevens:

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;

Uitgangen:

db<>fiddle hier




  1. InnoDB mySQL kan ON DELETE SET DEFAULT niet instellen. Hoe instellen?

  2. java-code voor het importeren van xls-gegevens in mysql-database

  3. Grote aantallen mysql-updates en invoegingen versnellen

  4. Hoe gegenereerde PDF-bestanden opslaan in de MySQL-database met Java?