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

Uruchamianie sumy przez powtarzające się grupowanie według elementów na podstawie czasu w Oracle SQL

Aby uzyskać sumy, których szukasz, potrzebujesz sposobu na pogrupowanie interesujących Cię wartości. Możesz wygenerować identyfikator grupowania, używając kilku ROW_NUMBER funkcje analityczne, podzielone według wartości klucza. Jednak ze względu na potrzebę zduplikowania KEY wartości kolumn należy to zrobić w kilku etapach:

WITH t1 AS (
  SELECT dta.*
       , last_value(KEY IGNORE NULLS)          -- Fill in the missing
               OVER (ORDER BY TIME ASC) key2   -- key values
    FROM your_data dta
), t2 AS (
  SELECT t1.*
       , row_number() OVER (ORDER BY TIME)     -- Generate a
       - row_number() OVER (PARTITION BY key2  -- grouping ID
                                ORDER BY TIME) gp
    FROM t1
)
SELECT t2.*
     , sum(amt) OVER (PARTITION BY gp, key2
                          ORDER BY TIME) running_sums
  FROM t2;

Powyższe zapytanie tworzy sumę bieżącą AMT, która jest uruchamiana ponownie za każdym razem, gdy zmienia się wartość klucza. Podczas gdy następujące zapytanie użyte w miejsce ostatniej instrukcji select powyżej daje żądane wyniki, których nie nazwałbym sumą bieżącą.

SELECT key2
     , MIN(TIME) start_time
     , MAX(TIME) stop_time
     , sum(amt) amt
  FROM t2
 GROUP BY key2, gp;

Aby zobaczyć pełne wartości czasu, możesz zmienić swoją sesję NLS_DATE_FORMAT jak poniżej:

ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';

Lub zawiń każdą kolumnę daty w TO_CHAR funkcja do celów wyjściowych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Maksymalna suma zapytania

  2. Tworzenie i używanie tabeli tymczasowej w zapytaniach zagnieżdżonych

  3. Jak konwertować wiersze na kolumny w tabeli Oracle

  4. Indeks dla kolumny dopuszczającej wartość null

  5. Zależności klienta Oracle.DataAccess