select zam_id, cena_euro,(rank() over (partition by zam_id order by cena_euro)) from pozycjezamowien order by zam_id

Podobne dokumenty
ORACLE. System Zarządzania Bazą Danych Oracle. Oracle Advanced SQL

Widok Connections po utworzeniu połączenia. Obszar roboczy

Relacyjne bazy danych. Podstawy SQL

Język SQL, zajęcia nr 1

Relacyjne bazy danych. Podstawy SQL

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Wykład 6. SQL praca z tabelami 3

Rozszerzenia grupowania

Paweł Rajba

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy Danych II. Ćwiczenia

Bazy danych. dr inż. Arkadiusz Mirakowski

Wykład 5. SQL praca z tabelami 2

Bazy danych wykład trzeci. Konrad Zdanowski

PODSTAWY BAZ DANYCH. 10. Partycjonowanie tabel i indeksów. 2009/ Notatki do wykładu "Podstawy baz danych"

Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę:

Grupowanie i funkcje agregacji

Modelowanie wymiarów

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Grupowanie i funkcje agregujące

Przestrzenne bazy danych Podstawy języka SQL

Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem.

Wykład 05 Bazy danych

Bazy danych - Materiały do laboratoriów VIII

PODSTAWY BAZ DANYCH Wykład Partycjonowanie tabel i indeksów

Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

Wykład 8. SQL praca z tabelami 5

SQL (ang. Structured Query Language)

188 Funkcje analityczne

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Plan. Wyświetlanie n początkowych wartości (TOP n) Użycie funkcji agregujących. Grupowanie danych - klauzula GROUP BY

ORACLE. System Zarządzania Bazą Danych Oracle. Oracle Advanced SQL

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Struktura drzewa w MySQL. Michał Tyszczenko

Przydatne sztuczki - sql. Na przykładzie postgres a.

Część 1: OLAP. Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Systemy GIS Tworzenie zapytań w bazach danych

Rozdział 14 Funkcje analityczne

Bazy danych 7. SQL podstawy

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

SQL do zaawansowanych analiz danych część 2.

BAZY DANYCH wprowadzenie do języka SQL. Opracował: dr inż. Piotr Suchomski

Przykładowa baza danych BIBLIOTEKA

Bazy danych. Dr inż. Paweł Kasprowski

Grupowanie danych klauzula GROUP BY

Klasyczna Analiza Danych

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

SQL do zaawansowanych analiz danych część 1.

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

Funkcje analityczne SQL CUBE (1)

Zarzadzanie transakcjami. Transakcje

ACESS- zadania z wykorzystaniem poleceń SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Relacji między tabelami klucze obce. Schemat bazy danych, wczytanej z pliku create_tables.sql. Klucz obcy jako ograniczenie dla kolumny

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Jerzy Nawrocki, Wprowadzenie do informatyki

SQL w praktyce. Miłej i owocnej nauki!!!

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Bazy danych - Materiały do laboratoriów IV

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Hurtownie danych - przegląd technologii

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Język SQL. Rozdział 9. Język definiowania danych DDL, cześć 1. Tworzenie relacji, typy danych, wartości domyślne atrybutów, słownik bazy danych.

Tabela SPRZEDAŻ WYCIECZEK

Ćwiczenie 3. Funkcje analityczne

Kurs. Podstawy MySQL

SIECI KOMPUTEROWE I BAZY DANYCH

PODZAPYTANIE (SUBSELECT)

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Bazy danych SQL Server 2005

Oracle PL/SQL. Paweł Rajba.

Bazy Danych i Usługi Sieciowe

Autor: Joanna Karwowska

PODSTAWY BAZ DANYCH 13. PL/SQL

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Bazy danych. Polecenia SQL

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Bazy danych 10. SQL Widoki

Autor: Joanna Karwowska

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Bazy danych i usługi sieciowe

Bazy danych 5. Samozłaczenie SQL podstawy

Transkrypt:

See also: OLAP.mth Suma narastająco... 1 Min max w poszczególnych grupach... 1 Numeracja elementów w grupach... 1 KLAUZULE GROUP BY, GROUP BY CUBE, GROUP BY ROLLUP... 1 MATERIAŁ ROBOCZY... 5 First VALUE SELECT DISTINCT REQUEST_ID, JE_HEADER_ID, JE_LINE_NUM, (FIRST_VALUE(JOIN_ID) OVER (PARTITION BY JE_HEADER_ID, JE_LINE_NUM ORDER BY SPOSOB) ) JOIN_ID FROM XXGLMSZ_KGW009 ORDER BY JE_HEADER_ID, JE_LINE_NUM Suma narastająco SELECT accounted_dr, (SUM(accounted_dr) over (PARTITION BY '1' ORDER BY creation_date)) suma_narastajaco FROM gl_je_lines WHERE code_combination_id = 4388 ORDER BY creation_date Min max w poszczególnych grupach SELECT department_id, MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) OVER(PARTITION department_id) "W", MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) OVER(PARTITION department_id) "B" FROM employees GROUP BY department_id; DEPARTMENT_ID Worst Best ------------- ---------- ---------- 10 4400 4400 20 6000 13000 30 2500 11000 40 6500 6500 50 2100 8200 Numeracja elementów w grupach select zam_id, cena_euro,(rank() over (partition by zam_id order by cena_euro)) from pozycjezamowien order by zam_id select rownum, (row_number() over (partition by null order by sygnatura) ) ordered_number from faktury order by sygnatura Numerowanie rekordów kolejno select (row_number() OVER (partition by null order by null)) from fa_retirements Data do = data od -1 z następnego rekordu CREATE TABLE CWF_D_LOOKUP_VALUES ( ID NUMBER NOT NULL, LOOKUPV_CODE VARCHAR2(255 BYTE) NOT NULL, LOOKUP_VALUE_CODE VARCHAR2(30 CHAR) NOT NULL, LOOKUP_TYPE_CODE VARCHAR2(20 BYTE) NOT NULL, VALUE VARCHAR2(255 BYTE), DESCRIPTION ATTRIBUTE1 ATTRIBUTE2 ATTRIBUTE3

ATTRIBUTE4 ATTRIBUTE5 START_DATE DATE NOT NULL, END_DATE DATE, CREATED_BY_LOGIN VARCHAR2(255 BYTE) NOT NULL, CREATED_BY_IP VARCHAR2(15 BYTE) NOT NULL, CREATION_DATE TIMESTAMP(9) NOT NULL, LAST_UPDATED_BY_LOGIN VARCHAR2(255 BYTE) NOT NULL, LAST_UPDATED_BY_IP VARCHAR2(15 BYTE) NOT NULL, LAST_UPDATE_DATE TIMESTAMP(9) NOT NULL, SEQNUM NUMBER, ACTIVE_FLAG VARCHAR2(1 BYTE) ; Insert into FLEX_COL_USAGE (START_DATE, LOOKUP_TYPE_CODE, LOOKUP_VALUE_CODE, DO_DNIA, DESCRIPTION) Values (TO_DATE('03/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'BIK01', 'LOOKUP_VALUE_CODE', TO_DATE('04/30/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'WRROEKXHDVKMEYG'); Insert into FLEX_COL_USAGE (START_DATE, LOOKUP_TYPE_CODE, LOOKUP_VALUE_CODE, DO_DNIA, DESCRIPTION) Values (TO_DATE('05/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'BIK01', 'LOOKUP_VALUE_CODE', TO_DATE('06/30/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'NGHDPQOEHVULYXW'); Insert into FLEX_COL_USAGE (START_DATE, LOOKUP_TYPE_CODE, LOOKUP_VALUE_CODE, DO_DNIA, DESCRIPTION) Values (TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'BIK01', 'LOOKUP_VALUE_CODE', TO_DATE('12/31/4712 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'BYIHLQAYOIELSPN'); COMMIT; select start_date, nvl(lead(start_date-1)over(partition by lookup_type_code order by start_date),date'4712-12-31') end_date, lookup_type_code, lookup_value_code, description from cwf_d_lookup_values where 'BIK01' = lookup_type_code and 'LOOKUP_VALUE_CODE' = lookup_value_code order by start_date START_DATE END_DATE LOOKUP_TYPE_CODE LOOKUP_VALUE_CODE DESCRIPTION 2010-03-01 2010-04-30 BIK01 LOOKUP_VALUE_CODE WRROEKXHDVKMEYG 2010-05-01 2010-06-30 BIK01 LOOKUP_VALUE_CODE NGHDPQOEHVULYXW 2010-07-01 4712-12-31 BIK01 LOOKUP_VALUE_CODE BYIHLQAYOIELSPN Jest też funkcja LAG Suma z ominięciem powtarzających się elementów CREATE TABLE XXTESTANALYT ( ID NUMBER, VAL NUMBER ); Insert into XXTESTANALYT (ID, VAL) Values (1, 2); Insert into XXTESTANALYT (ID, VAL) Values (1, 2); Insert into XXTESTANALYT (ID, VAL) Values (1, 2); Insert into XXTESTANALYT (ID, VAL) Values (2, 3); Insert into XXTESTANALYT (ID, VAL) Values (2, 3); Insert into XXTESTANALYT (ID, VAL) Values (3, 4); Insert into XXTESTANALYT (ID, VAL) Values (4, 1); Insert into XXTESTANALYT (ID, VAL) Values (4, 1); Insert into XXTESTANALYT (ID, VAL) Values (4, 1); COMMIT; select id, val -- ostatnia wartosc (LAST_VALUE) z zakresu (OVER) miêdzy 1 a id-1, po posortwaniu danych wg id -- PARTITION by null mo na omin¹c, last_value(val) OVER (PARTITION by null ORDER BY id RANGE BETWEEN id-1 PRECEDING AND 1 PRECEDING) analyt_alone, val+nvl(last_value(val) OVER (ORDER BY id RANGE BETWEEN id-1 PRECEDING AND 1 PRECEDING),0) analyt from xxtestanalyt zamiast PRECEDING można też napisać FOLLOWING

KLAUZULE GROUP BY, GROUP BY CUBE, GROUP BY ROLLUP Klauzula Opis Zastosowanie GROUP BY A,B,C Grupuje dane po kolumnach (A,B,C) Podsumowania GROUP BY ROLLUP(A,B,C) zwija wymiary od końca tj. grupuje dane wg: ABC, AB, A, NULL Podsumowania po poszczególnych poziomach hierarchii, np.: Szczegółowo Wg komórek Wg pionu GROUP BY CUBE(A,B,C) Grupuje dane wszystkich kombinacjach kolumn A,B,C tj. ABC, AB,AC,BC,A,B,C,NULL Aby sprawdzić, po których kolumnach następuje grupowanie, użyj funkcji GROUPING, np. GROUPING(A) = 1 OZNACZA, ZE ZESTAWIENIE JEST BEZ UZWGLEDNIANIA KOLUMNY A Zamiennie z GROUP BY CUBE można uzywać po prostu iloczynu kartezjańskiego kilku tabel po dodaniu do każdej tabeli wartości null. Składnie CUBE jest bardziej zwięzła. W testach otrzymywałem ora-600 (Oracle R11R1) i wróciłem do zwykłego iloczynu kartezjańskiego. Przykład poniżej kluczowe w przykładach są komórki oznaczone kolorem błękitnym. Ogółem W planowaniu zajęć do wyznaczenia wszystkich kombinacji obiektów a następnie sprawdzenie uprawnień dla każdej kombinacji. CREATE TABLE XXCUBE ( LECTURER VARCHAR2(100), GROUP_NAME VARCHAR2(100), SUBJECT VARCHAR2(100)); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values ('ABACKI', 'C11', 'MATH'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values ('ABACKI', NULL, 'MATH'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values (NULL, 'C11', 'MATH'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values (NULL, NULL, 'MATH'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values ('ABACKI', 'C11', 'PHIS'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values ('ABACKI', NULL, 'PHIS'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values (NULL, 'C11', 'PHIS'); Insert into XXCUBE (LECTURER, GROUP_NAME, SUBJECT) Values (NULL, NULL, 'PHIS'); COMMIT; SELECT * FROM XXCUBE LECTURER GROUP_NAME SUBJECT

ABACKI C11 MATH ABACKI NULL MATH NULL C11 MATH NULL NULL MATH ABACKI C11 PHIS ABACKI NULL PHIS NULL C11 PHIS NULL NULL PHIS SELECT LECTURER, GROUP_NAME, SUBJECT, COUNT(*), GROUPING(LECTURER), GROUPING(GROUP_NAME), GROUPING(SUBJECT) FROM XXCUBE GROUP BY LECTURER, GROUP_NAME, SUBJECT ORDER BY COUNT(*) LECTURER GROUP_NAME SUBJECT COUNT(*) GROUPING(LECTURER) GROUPING(GROUP_NAME) GROUPING(SUBJECT) null null MATH 1 0 0 0 null null PHIS 1 0 0 0 null C11 MATH 1 0 0 0 null C11 PHIS 1 0 0 0 ABACKI null MATH 1 0 0 0 ABACKI null PHIS 1 0 0 0 ABACKI C11 MATH 1 0 0 0 ABACKI C11 PHIS 1 0 0 0 SELECT LECTURER, GROUP_NAME, SUBJECT, COUNT(*), GROUPING(LECTURER), GROUPING(GROUP_NAME), GROUPING(SUBJECT) FROM XXCUBE GROUP BY CUBE(LECTURER, GROUP_NAME, SUBJECT) ORDER BY GROUPING(LECTURER) *4 + GROUPING(GROUP_NAME) *2 + GROUPING(SUBJECT) *1, COUNT(*) LECTURER GROUP_NAME SUBJECT COUNT(*) GROUPING(LECTURER) GROUPING(GROUP_NAME) GROUPING(SUBJECT) null null MATH 1 0 0 0 null null PHIS 1 0 0 0 null C11 MATH 1 0 0 0 ABACKI null MATH 1 0 0 0 ABACKI null PHIS 1 0 0 0 ABACKI C11 PHIS 1 0 0 0 ABACKI C11 MATH 1 0 0 0 null C11 PHIS 1 0 0 0 null null null 2 0 0 1 ABACKI null null 2 0 0 1 ABACKI C11 null 2 0 0 1 null C11 null 2 0 0 1 null null MATH 2 0 1 0 null null PHIS 2 0 1 0 ABACKI null MATH 2 0 1 0 ABACKI null PHIS 2 0 1 0 null null null 4 0 1 1 ABACKI null null 4 0 1 1 null null MATH 2 1 0 0 null C11 PHIS 2 1 0 0 null null PHIS 2 1 0 0 null C11 MATH 2 1 0 0 null null null 4 1 0 1 null C11 null 4 1 0 1

null null MATH 4 1 1 0 null null PHIS 4 1 1 0 null null null 8 1 1 1 SELECT LECTURER, GROUP_NAME, SUBJECT, COUNT(*), GROUPING(LECTURER), GROUPING(GROUP_NAME), GROUPING(SUBJECT) FROM XXCUBE GROUP BY ROLLUP(LECTURER, GROUP_NAME, SUBJECT) ORDER BY GROUPING(LECTURER) *4 + GROUPING(GROUP_NAME) *2 + GROUPING(SUBJECT) *1, COUNT(*) LECTURER GROUP_NAME SUBJECT COUNT(*) GROUPING(LECTURER) GROUPING(GROUP_NAME) GROUPING(SUBJECT) null null MATH 1 0 0 0 null null PHIS 1 0 0 0 null C11 MATH 1 0 0 0 null C11 PHIS 1 0 0 0 ABACKI null MATH 1 0 0 0 ABACKI null PHIS 1 0 0 0 ABACKI C11 PHIS 1 0 0 0 ABACKI C11 MATH 1 0 0 0 null null null 2 0 0 1 null C11 null 2 0 0 1 ABACKI C11 null 2 0 0 1 ABACKI null null 2 0 0 1 null null null 4 0 1 1 ABACKI null null 4 0 1 1 null null null 8 1 1 1 MATERIAŁ ROBOCZY Screen z discoverera

sumy zamówień SELECT ZAM_ID, SUM(CENA_EURO) OVER ( PARTITION BY ZAM_ID ORDER BY ZAM_ID) FROM

POZYCJE_ZAMOWIEN ANALITIC FUNCTIONS - EXAMPLE OF USE Zaremowane fragmenty dotyczą pułapki wachlarzowej do tego przykładu nic nowego to nie wnosi. Example data ============= drop table orders; drop table lines; drop table locations; --drop table invoices; --create table invoices ( id number, no varchar2(10), ord_id number); create table orders ( id number, no varchar2(10)); create table lines number); ( ord_id number, id number, no varchar2(10), amount number, quantity create table locations ( lin_id number, id number, client varchar2(10), quantity number); insert into orders (id, no) values ( 1, 'z1'); insert into lines ( id, ord_id, no, amount, quantity) values (1,1,1,10,2); insert into locations ( id, lin_id, client, quantity) values ( 1,1,'a',1); insert into locations ( id, lin_id, client, quantity) values ( 2,1,'b',1); insert into lines ( id, ord_id, no, amount, quantity) values (2,1,2,20,2); insert into locations ( id, lin_id, client, quantity) values ( 3,2,'c',1); insert into locations ( id, lin_id, client, quantity) values ( 4,2,'d',1); insert into lines ( id, ord_id, no, amount, quantity) values (3,1,3,30,2); insert into locations ( id, lin_id, client, quantity) values ( 5,3,'e',1); insert into locations ( id, lin_id, client, quantity) values ( 6,3,'f',1); insert into orders (id, no) values ( 2, 'z2');

insert into lines ( id, ord_id, no, amount, quantity) values (4,2,1,40,2); insert into locations ( id, lin_id, client, quantity) values ( 7,4,'g',1); insert into locations ( id, lin_id, client, quantity) values ( 8,4,'h',1); insert into lines ( id, ord_id, no, amount, quantity) values (5,2,2,50,2); insert into locations ( id, lin_id, client, quantity) values ( 9,5,'i',1); insert into locations ( id, lin_id, client, quantity) values (10,5,'j',1); insert into lines ( id, ord_id, no, amount, quantity) values (6,2,3,60,2); insert into locations ( id, lin_id, client, quantity) values (11,6,'k',1); insert into locations ( id, lin_id, client, quantity) values (12,6,'l',1); --insert into invoices ( id, ord_id, no ) values (1,1, '1'); --insert into invoices ( id, ord_id, no ) values (2,1, '2'); --insert into invoices ( id, ord_id, no ) values (3,2, '3'); --insert into invoices ( id, ord_id, no ) values (4,2, '4'); QUERIES ======== -- to zapytanie zwróci 24 w kolumnie sum (lin.quantity), co jest nieprawda, bo powinno wyjsc 12 ( rekordy podrzedne podwoily ilosc ) select sum (lin.quantity), sum (loc.quantity) from orders ord, lines lin, locations loc --, invoices inv where lin.ord_id = ord.id and loc.lin_id = lin.id -- and inv.ord_id = ord.id -- to zapytanie zachowa sie prawidlowo - zwroci 12 w kolumnie sum (lin.quantity) select ord.no, sum (lin.quantity) over (partition by lin.ord_id), sum (loc.quantity) over (partition by lin.ord_id) from orders ord, lines lin, locations loc --, invoices inv where lin.ord_id = ord.id and loc.lin_id = lin.id -- and inv.ord_id = ord.id