{"id":4512,"date":"2024-02-09T13:16:35","date_gmt":"2024-02-09T12:16:35","guid":{"rendered":"https:\/\/www.skillup.cloud\/?p=4512"},"modified":"2024-02-12T09:41:33","modified_gmt":"2024-02-12T08:41:33","slug":"olap-functions-in-sql-iseries-per-unanalisi-dati-avanzata-un-focus-sulle-windows-functions","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/it\/olap-functions-in-sql-iseries-per-unanalisi-dati-avanzata-un-focus-sulle-windows-functions\/","title":{"rendered":"OLAP Functions in SQL iSeries per un&#8217;Analisi Dati Avanzata: Un Focus sulle Windows Functions"},"content":{"rendered":"\n<p>Nel regno dell&#8217;analisi e della gestione dei dati sui sistemi IBM iSeries, SQL offre un potente insieme di strumenti progettati per migliorare l&#8217;efficienza e la profondit\u00e0 dell&#8217;interrogazione dei dati.<\/p>\n\n\n\n<p>Tra questi strumenti, le funzioni OLAP (Online Analytical Processing) spiccano per la loro capacit\u00e0 di eseguire query analitiche complesse direttamente nell&#8217;ambiente SQL.<\/p>\n\n\n\n<p>Questo post esplora la categoria specializzata di funzioni OLAP note come Funzioni di Finestra, che forniscono un meccanismo sofisticato per accedere e analizzare i punti dati in un dataset senza la necessit\u00e0 di join su s\u00e9 stessi ingombranti.<\/p>\n\n\n\n<p>Le Funzioni di Finestra consentono agli analisti e agli sviluppatori di eseguire confronti e analisi di dati complessi con maggiore semplicit\u00e0 ed eleganza.<\/p>\n\n\n\n<p>Definendo una &#8220;finestra&#8221; o un sottoinsieme di righe in un set di risultati, queste funzioni permettono l&#8217;esecuzione di calcoli su queste righe, offrendo intuizioni che sono sia ampie che profondamente contestualizzate nel panorama dei dati.<\/p>\n\n\n\n<p>Tra le Funzioni di Finestra pi\u00f9 importanti troviamo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>LEAD e LAG<\/strong>: Queste funzioni sono fondamentali nella navigazione dei dati temporali o sequenziali, permettendo agli utenti di accedere ai dati da una riga successiva (LEAD) o da una riga precedente (LAG) con una facilit\u00e0 senza precedenti. Questa capacit\u00e0 \u00e8 essenziale per l&#8217;analisi delle tendenze, le previsioni e l&#8217;esame delle progressioni dei dati nel tempo senza la complessit\u00e0 dei join su s\u00e9 stessi.<\/li>\n\n\n\n<li><strong>FIRST_VALUE e LAST_VALUE<\/strong>: Consentendo un accesso diretto al primo o all&#8217;ultimo valore all&#8217;interno di una finestra specificata, queste funzioni facilitano analisi che richiedono la comprensione del punto di inizio o di conclusione dell&#8217;intervallo di valori di un dataset. Tali intuizioni sono cruciali per identificare i punti di partenza, i punti finali e i cambiamenti nelle tendenze dei dati.<\/li>\n\n\n\n<li><strong>NTH_VALUE()<\/strong>: Questa funzione estende la versatilit\u00e0 delle funzioni di finestra estraendo il valore di una colonna specificata alla n-esima posizione all&#8217;interno della finestra, offrendo un controllo preciso sulla selezione dei punti dati all&#8217;interno di un dataset. Apre possibilit\u00e0 per analisi mirate e studi comparativi attraverso segmenti di dati vari.<\/li>\n<\/ul>\n\n\n\n<p>L&#8217;adozione delle Funzioni di Finestra in SQL iSeries non solo semplifica compiti di analisi dati complessi ma migliora significativamente la capacit\u00e0 di trarre conclusioni significative da dataset grandi e diversificati.<\/p>\n\n\n\n<p>Sfruttando queste funzioni, i professionisti possono sbloccare un livello superiore di precisione analitica ed efficienza, spingendo i limiti di ci\u00f2 che pu\u00f2 essere realizzato nell&#8217;analisi dei dati sulla piattaforma IBM iSeries.<\/p>\n\n\n\n<p>Questo post mira a fornire una comprensione completa di queste potenti funzioni OLAP, illustrando il loro potenziale attraverso esempi e best practices, per potenziare gli utenti nell&#8217;utilizzo delle loro complete capacit\u00e0 analitiche all&#8217;interno dell&#8217;ambiente SQL iSeries.<\/p>\n\n\n\n<p>Questa introduzione prepara il terreno per un&#8217;esplorazione pi\u00f9 profonda delle funzioni di finestra, sottolineando la loro importanza e utilit\u00e0 nell&#8217;analisi dei dati all&#8217;interno del framework SQL iSeries.<\/p>\n\n\n\n<p>Di seguito gli esempi che evidenziano l&#8217;uso delle funzioni OLAP in iSeries SQL, concentrandosi sulle funzioni finestra LEAD, LAG, FIRST_VALUE, LAST_VALUE e NTH_VALUE(). Creeremo un set di dati di esempio per testare queste funzioni utilizzando una Common Table Expression (CTE) con un&#8217;istruzione VALUES.<\/p>\n\n\n\n<p>Questo approccio simula uno scenario pratico, fornendo un contesto chiaro per l&#8217;applicazione di queste funzioni e ci consente di applicare direttamente le nostre funzioni di finestra su un set di dati di esempio, senza la necessit\u00e0 di avere accesso a una base dati reale.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"256\" src=\"https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1017.png\" alt=\"\" class=\"wp-image-4527\" srcset=\"https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1017.png 512w, https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1017-300x150.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n<p class=\"has-larger-font-size\"><strong>Esempio 1: LEAD e LAG OLAP Functions<\/strong><\/p>\n\n\n\n<p>In questo esempio, esploreremo l&#8217;utilizzo avanzato delle funzioni OLAP in SQL, specificatamente su un sistema iSeries, per analizzare i dati di vendita e scoprire pattern interessanti nei comportamenti d&#8217;acquisto dei clienti.<\/p>\n\n\n\n<p>Le funzioni OLAP, come <strong>LEAD<\/strong>, <strong>LAG<\/strong>, ci permettono di esaminare le transazioni in maniera sequenziale, evidenziando la frequenza delle vendite e le variazioni degli importi di vendita tra transazioni consecutive.<\/p>\n\n\n\n<p>Utilizzeremo una Common Table Expression (CTE) per simulare un dataset di transazioni di vendita, contenente informazioni come ID transazione, ID cliente, data transazione e importo vendita.<\/p>\n\n\n\n<p>Attraverso la query seguente, dimostreremo come calcolare la differenza in giorni tra transazioni consecutive per ogni cliente, la variazione percentuale dell&#8217;importo di vendita da una transazione all&#8217;altra, e come accedere agli importi di vendita precedenti e successivi.<\/p>\n\n\n\n<p>L&#8217;obiettivo \u00e8 fornire intuizioni dettagliate sul comportamento d&#8217;acquisto dei clienti e sulla frequenza delle transazioni, utilizzando potenti strumenti di analisi dati integrati in SQL iSeries.<\/p>\n\n\n\n<p><strong>Vediamo la query in azione!<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WITH\n  SalesData (TrnID, CustID, TrnDate, SaleAmount) AS (\n    VALUES\n        (1,  'C1', DATE('2022-01-03'), 100)\n      , (2,  'C1', DATE('2022-02-06'), 150)\n      , (3,  'C1', DATE('2022-03-06'), 120)\n      , (4,  'C1', DATE('2022-05-29'), 170)\n      , (5,  'C1', DATE('2022-07-11'), 200)\n      , (6,  'C1', DATE('2022-10-12'), 100)\n      , (7,  'C2', DATE('2022-01-14'), 150)\n      , (8,  'C2', DATE('2022-01-16'), 120)\n      , (9,  'C2', DATE('2022-01-16'), 170)\n      , (10, 'C2', DATE('2022-01-17'), 200)\n      , (11, 'C2', DATE('2022-01-22'), 170)\n      , (12, 'C2', DATE('2022-01-26'), 200)\n)  -- select * from SalesData;\nSELECT TrnID \"Trn\"\n      , CustID \"Cust\"\n      , TrnDate \"Date\"\n      , SaleAmount \"Amount\"\n      , DAYS(TrnDate) - \n           DAYS(LAG(TrnDate) OVER (PARTITION BY CustID\n                ORDER BY TrnDate)) \"DaysPrev\"\n      , DAYS(LEAD(TrnDate) OVER (PARTITION BY CustID\n             ORDER BY TrnDate)) - DAYS(TrnDate)\n             \"DaysNext\"\n      , LAG(SaleAmount) OVER (PARTITION BY CustID\n                ORDER BY TrnDate) \"PrevAmount\"\n      , 100 * DECIMAL(DECIMAL(SaleAmount, 10, 4)\n        \/ DECIMAL(LAG(SaleAmount)\n                     OVER (PARTITION BY CustID\n                     ORDER BY TrnDate), 10, 3),\n                 10, 4) \"PercAmount\"\n      , LEAD(SaleAmount) OVER (PARTITION BY CustID\n                ORDER BY TrnDate) \"NextAmount\"\n  FROM  SalesData;\n<\/pre>\n\n\n\n<p><strong>Risultato:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Trn<\/td><td>Cust<\/td><td>Date<\/td><td>Amount<\/td><td>DaysPrev<\/td><td>DaysNext<\/td><td>PrevAmount<\/td><td>PercAmount<\/td><td>NextAmount<\/td><\/tr><tr><td>1<\/td><td>C1<\/td><td>2022-01-03<\/td><td>100<\/td><td>[NULL]<\/td><td>34<\/td><td>[NULL]<\/td><td>[NULL]<\/td><td>150<\/td><\/tr><tr><td>2<\/td><td>C1<\/td><td>2022-02-06<\/td><td>150<\/td><td>34<\/td><td>28<\/td><td>100<\/td><td>150<\/td><td>120<\/td><\/tr><tr><td>3<\/td><td>C1<\/td><td>2022-03-06<\/td><td>120<\/td><td>28<\/td><td>84<\/td><td>150<\/td><td>80<\/td><td>170<\/td><\/tr><tr><td>4<\/td><td>C1<\/td><td>2022-05-29<\/td><td>170<\/td><td>84<\/td><td>43<\/td><td>120<\/td><td>141,66<\/td><td>200<\/td><\/tr><tr><td>5<\/td><td>C1<\/td><td>2022-07-11<\/td><td>200<\/td><td>43<\/td><td>93<\/td><td>170<\/td><td>117,64<\/td><td>100<\/td><\/tr><tr><td>6<\/td><td>C1<\/td><td>2022-10-12<\/td><td>100<\/td><td>93<\/td><td>[NULL]<\/td><td>200<\/td><td>50<\/td><td>[NULL]<\/td><\/tr><tr><td>7<\/td><td>C2<\/td><td>2022-01-14<\/td><td>150<\/td><td>[NULL]<\/td><td>2<\/td><td>[NULL]<\/td><td>[NULL]<\/td><td>120<\/td><\/tr><tr><td>8<\/td><td>C2<\/td><td>2022-01-16<\/td><td>120<\/td><td>2<\/td><td>0<\/td><td>150<\/td><td>80<\/td><td>170<\/td><\/tr><tr><td>9<\/td><td>C2<\/td><td>2022-01-16<\/td><td>170<\/td><td>0<\/td><td>1<\/td><td>120<\/td><td>141,66<\/td><td>200<\/td><\/tr><tr><td>10<\/td><td>C2<\/td><td>2022-01-17<\/td><td>200<\/td><td>1<\/td><td>5<\/td><td>170<\/td><td>117,64<\/td><td>170<\/td><\/tr><tr><td>11<\/td><td>C2<\/td><td>2022-01-22<\/td><td>170<\/td><td>5<\/td><td>4<\/td><td>200<\/td><td>85<\/td><td>200<\/td><\/tr><tr><td>12<\/td><td>C2<\/td><td>2022-01-26<\/td><td>200<\/td><td>4<\/td><td>[NULL]<\/td><td>170<\/td><td>117,64<\/td><td>[NULL]<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Spiegazione dettagliata della Query<\/strong><\/p>\n\n\n\n<p>La nostra query SQL utilizza le funzioni OLAP <strong>LEAD<\/strong> e <strong>LAG<\/strong>, e calcola la differenza in giorni tra le date di transazione consecutive (<strong>TrnDate<\/strong>) per ogni cliente (<strong>CustID<\/strong>), oltre a calcolare la variazione percentuale dell&#8217;<strong>SaleAmount<\/strong> tra le transazioni consecutive.<\/p>\n\n\n\n<p>Vediamo nel dettaglio cosa fa la nostra query:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>WITH SalesData<\/strong>: Definisce una Common Table Expression (CTE) chiamata <strong>SalesData<\/strong> che simula una tabella di dati di vendita con colonne per l&#8217;ID transazione (<strong>TrnID<\/strong>), ID cliente (<strong>CustID<\/strong>), data transazione (<strong>TrnDate<\/strong>) e importo vendita (<strong>SaleAmount<\/strong>). Questo set di dati temporaneo viene utilizzato per dimostrare le funzioni di finestra.<\/li>\n\n\n\n<li><strong>SELECT Clause<\/strong>: Recupera varie informazioni per ogni transazione:\n<ul class=\"wp-block-list\">\n<li><strong>TrnID<\/strong> come &#8220;Trn&#8221;,<\/li>\n\n\n\n<li><strong>CustID<\/strong> come &#8220;Cust&#8221;,<\/li>\n\n\n\n<li><strong>TrnDate<\/strong> come &#8220;Date&#8221;,<\/li>\n\n\n\n<li><strong>SaleAmount<\/strong> come &#8220;Amount&#8221;.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>DAYS(TrnDate) &#8211; DAYS(LAG(TrnDate)&#8230;) &#8220;DaysPrev&#8221;<\/strong>: Calcola la differenza in giorni tra la data di transazione corrente e la data di transazione precedente per lo stesso cliente. Questo mostra quanti giorni sono passati dall&#8217;ultima transazione per ogni cliente.<\/li>\n\n\n\n<li><strong>DAYS(LEAD(TrnDate)&#8230;) &#8211; DAYS(TrnDate) &#8220;DaysNext&#8221;<\/strong>: Calcola la differenza in giorni tra la data di transazione successiva e la data di transazione corrente per lo stesso cliente. Indica quanti giorni passeranno fino alla prossima transazione per ogni cliente.<\/li>\n\n\n\n<li><strong>LAG(SaleAmount) OVER&#8230; &#8220;PrevAmount&#8221;<\/strong>: Recupera l&#8217;importo di vendita dalla transazione precedente per lo stesso cliente. Questo permette di confrontare direttamente l&#8217;importo di vendita corrente con quello precedente.<\/li>\n\n\n\n<li><strong>100 * DECIMAL(&#8230;) &#8220;PercAmount&#8221;<\/strong>: Calcola la variazione percentuale dell&#8217;importo di vendita tra la transazione corrente e la precedente per lo stesso cliente. Si tratta di una misura di quanto l&#8217;importo di vendita sia aumentato o diminuito in termini percentuali da una transazione all&#8217;altra.<\/li>\n\n\n\n<li><strong>LEAD(SaleAmount) OVER&#8230; &#8220;NextAmount&#8221;<\/strong>: Recupera l&#8217;importo di vendita per la transazione successiva per lo stesso cliente. Simile a &#8220;PrevAmount&#8221;, ma per la transazione successiva.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Riepilogo<\/strong><\/p>\n\n\n\n<p>Questa query dimostra efficacemente il potere delle funzioni di finestra in SQL per eseguire analisi complesse, come il calcolo delle differenze e delle variazioni percentuali tra le righe in un dataset partizionato senza la necessit\u00e0 di unire la tabella con se stessa.<\/p>\n\n\n\n<p>\u00c8 un approccio molto utile per analizzare dati di serie temporali, modelli di transazione dei clienti o qualsiasi scenario in cui \u00e8 necessario confrontare i record in sequenza.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"256\" src=\"https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1011.png\" alt=\"\" class=\"wp-image-4523\" srcset=\"https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1011.png 512w, https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/02\/img_512x256_20240211_1011-300x150.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n<p class=\"has-larger-font-size\"><strong>Esempio 2: FIRST_VALUE, LAST_VALUE e NTH_VALUE()&nbsp; OLAP Functions<\/strong><\/p>\n\n\n\n<p>Per dimostrare l&#8217;utilizzo delle funzioni finestra <strong>FIRST_VALUE, LAST_VALUE<\/strong> e <strong>NTH_VALUE()<\/strong> in iSeries SQL, creiamo uno scenario in cui queste funzioni possono essere applicate in modo significativo.<\/p>\n\n\n\n<p>Simuleremo un set di dati di vendita utilizzando un&#8217;espressione di tabella comune (CTE) con <strong>VALUES<\/strong> per preparare i dati per il test.<\/p>\n\n\n\n<p>Questa configurazione ci aiuter\u00e0 a esplorare queste funzioni analizzando le transazioni di vendita, identificando modelli o estraendo approfondimenti specifici senza la necessit\u00e0 di auto-join.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Scenario: analisi dei dati di vendita mensili<\/strong><\/p>\n\n\n\n<p>Supponiamo di avere un set di dati che rappresenta gli importi delle vendite mensili per diversi prodotti in un anno. Vogliamo trovare il primo, l&#8217;ultimo e l&#8217;importo delle vendite di un mese specifico (ad esempio, il sesto mese) per ciascun prodotto all&#8217;interno di questo set di dati.<\/p>\n\n\n\n<p><strong>Vediamo la query in azione!<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WITH MonthlySales (ProductID, Month, SalesAmount) AS (\n    VALUES\n        ('P1', '2022-01', 500), ('P1', '2022-02', 450)\n      , ('P1', '2022-03', 600), ('P1', '2022-04', 550)\n      , ('P1', '2022-05', 650), ('P1', '2022-06', 700)\n      , ('P1', '2022-07', 550), ('P1', '2022-08', 480)\n      , ('P1', '2022-09', 610), ('P1', '2022-10', 550)\n      , ('P1', '2022-11', 660), ('P1', '2022-12', 720)\n      , ('P2', '2022-01', 380), ('P2', '2022-02', 450)\n      , ('P2', '2022-03', 600), ('P2', '2022-04', 550)\n      , ('P2', '2022-05', 650), ('P2', '2022-06', 660)\n      , ('P2', '2022-07', 550), ('P2', '2022-08', 480)\n      , ('P2', '2022-09', 610), ('P2', '2022-10', 550)\n      , ('P2', '2022-11', 660), ('P2', '2022-12', 620)\n) \nSELECT distinct\n    ProductID \"ProductID\"\n  , SUM(SalesAmount) OVER (PARTITION BY ProductID) \"TotalAmount\"\n  , FIRST_VALUE(SalesAmount)\n          OVER (PARTITION BY ProductID\n          ORDER BY Month\n               ROWS BETWEEN UNBOUNDED PRECEDING\n               AND UNBOUNDED FOLLOWING)\n          AS \"FirstSaleAmount\"\n  , LAST_VALUE(SalesAmount)\n          OVER (PARTITION BY ProductID\n          ORDER BY Month\n          ROWS BETWEEN UNBOUNDED PRECEDING\n               AND UNBOUNDED FOLLOWING)\n          AS \"LastSaleAmount\"\n  , NTH_VALUE(SalesAmount, 6)\n          OVER (PARTITION BY ProductID\n          ORDER BY Month\n          ROWS BETWEEN UNBOUNDED PRECEDING\n               AND UNBOUNDED FOLLOWING)\n          AS \"SixthMonthSales\"\nFROM MonthlySales\norder by 1;\n<\/pre>\n\n\n\n<p><strong>Risultato:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<figure class=\"wp-block-table\"><table><tbody><tr><td>ProductID<\/td><td>TotalAmount<\/td><td>FirstSaleAmount<\/td><td>LastSaleAmount<\/td><td>SixthMonthSales<\/td><\/tr><tr><td>P1<\/td><td>7.020<\/td><td>500<\/td><td>720<\/td><td>700<\/td><\/tr><tr><td>P2<\/td><td>6.760<\/td><td>380<\/td><td>620<\/td><td>660<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-medium-font-size\"><strong><strong>Spiegazione dettagliata della Query<\/strong><\/strong><\/p>\n\n\n\n<p>Questa query SQL utilizza una Common Table Expression (CTE) e diverse funzioni di finestra per analizzare i dati di vendita dei prodotti nel corso di un anno.<\/p>\n\n\n\n<p>Ecco una ripartizione dettagliata di ciascun componente e funzione utilizzata nella query:<\/p>\n\n\n\n<p><strong>Common Table Expression (CTE): MonthlySales<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>WITH MonthlySales (ProductID, Month, SalesAmount) AS (&#8230;)<\/strong>: Definisce una CTE chiamata <strong>MonthlySales<\/strong>. Questo insieme di risultati temporaneo include tre colonne: <strong>ProductID<\/strong> per l&#8217;identificativo del prodotto, <strong>Month<\/strong> per il mese della vendita, e <strong>SalesAmount<\/strong> per l&#8217;importo venduto in quel mese. La clausola <strong>VALUES<\/strong> che segue questa definizione popola la CTE con i dati di vendita per i prodotti <strong>P1<\/strong> e <strong>P2<\/strong> attraverso vari mesi nel 2022.<\/li>\n<\/ul>\n\n\n\n<p><strong>SELECT Statement<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SELECT distinct<\/strong>: Questo comando seleziona righe uniche basate sulla combinazione di valori nelle colonne selezionate. Assicura che ogni <strong>ProductID<\/strong> appaia solo una volta nell&#8217;output, accompagnato dalle metriche calcolate per l&#8217;importo totale delle vendite, l&#8217;importo della prima vendita, l&#8217;importo dell&#8217;ultima vendita e l&#8217;importo delle vendite del sesto mese.<\/li>\n<\/ul>\n\n\n\n<p><strong>Window Functions<\/strong><\/p>\n\n\n\n<p>La query utilizza funzioni di finestra per calcolare metriche specifiche per ogni prodotto. Le funzioni di finestra eseguono calcoli su un insieme di righe della tabella che sono in qualche modo correlate alla riga corrente.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>SUM(SalesAmount) OVER (PARTITION BY ProductID)<\/strong>: Calcola l&#8217;importo totale delle vendite per ogni prodotto (<strong>ProductID<\/strong>). La clausola <strong>PARTITION BY ProductID<\/strong> assicura che la somma sia calcolata separatamente per ogni prodotto.<\/li>\n\n\n\n<li><strong>FIRST_VALUE(SalesAmount) OVER (PARTITION BY ProductID ORDER BY Month ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)<\/strong>: Determina l&#8217;importo della prima vendita all&#8217;interno di ogni partizione del prodotto, ordinata per mese. Il frame di finestra specificato da <strong>ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING<\/strong> assicura che la funzione consideri tutte le righe nella partizione dall&#8217;inizio alla fine. Tuttavia, poich\u00e9 <strong>FIRST_VALUE<\/strong> guarda intrinsecamente al primo valore nella sequenza ordinata, la specificazione del frame \u00e8 tecnicamente non necessaria per il suo funzionamento ma \u00e8 sintatticamente richiesta da alcuni dialetti SQL.<\/li>\n\n\n\n<li><strong>LAST_VALUE(SalesAmount) OVER (&#8230;)<\/strong>: Trova l&#8217;importo dell&#8217;ultima vendita per ogni prodotto, utilizzando una clausola di partizionamento e ordinamento simile a <strong>FIRST_VALUE<\/strong>. La differenza chiave \u00e8 nella sua applicazione: <strong>LAST_VALUE<\/strong> guarda all&#8217;ultimo valore nella sequenza. Il frame <strong>ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING<\/strong> \u00e8 cruciale qui per assicurare che la funzione consideri correttamente l&#8217;intero intervallo della partizione, specialmente nei database che richiedono una specificazione esplicita del frame per restituire il vero ultimo valore attraverso l&#8217;intera sequenza.<\/li>\n\n\n\n<li><strong>NTH_VALUE(SalesAmount, 6) OVER (&#8230;)<\/strong>: Recupera l&#8217;importo delle vendite per il sesto mese per ogni prodotto. La funzione \u00e8 partizionata per <strong>ProductID<\/strong> e ordinata per <strong>Month<\/strong>, simile alle funzioni precedenti. Il frame <strong>ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING<\/strong> \u00e8 specificato, anche se per <strong>NTH_VALUE<\/strong>, la preoccupazione principale \u00e8 l&#8217;ordinamento corretto e la posizione specifica (la sesta) all&#8217;interno di quell&#8217;ordine.<\/li>\n<\/ol>\n\n\n\n<p><strong>FROM Clause<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FROM MonthlySales<\/strong>: Indica che i dati per questa query provengono dalla CTE <strong>MonthlySales<\/strong> definita all&#8217;inizio.<\/li>\n<\/ul>\n\n\n\n<p><strong>ORDER BY Clause<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ORDER BY 1<\/strong>: Ordina i risultati per la prima colonna nella lista SELECT, che \u00e8 <strong>ProductID<\/strong>. Questo assicura che l&#8217;output sia ordinato alfabeticamente o numericamente basato sui valori di <strong>ProductID<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Riepilogo<\/strong><\/p>\n\n\n\n<p>La query \u00e8 strutturata per fornire una visualizzazione completa dei dati di vendita per ciascun prodotto, calcolando l&#8217;importo totale delle vendite e identificando gli importi delle vendite del primo, dell&#8217;ultimo e del sesto mese utilizzando le funzioni della finestra.<\/p>\n\n\n\n<p>Queste funzioni consentono calcoli avanzati all&#8217;interno di ciascuna partizione <strong>ProductID<\/strong> mantenendo la leggibilit\u00e0 e l&#8217;efficienza nell&#8217;istruzione SQL. L&#8217;uso delle clausole <strong>DISTINCT<\/strong> e <strong>ORDER<\/strong> <strong>BY<\/strong> garantisce che l&#8217;output sia conciso e ben organizzato.<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>Conclusioni<\/strong><\/p>\n\n\n\n<p>Questi esempi illustrano la potenza delle funzioni finestra in SQL per iSeries, consentendo l&#8217;analisi complessa dei dati senza la necessit\u00e0 di self-join.<\/p>\n\n\n\n<p>Utilizzando un CTE per simulare un set di dati reale, abbiamo mostrato applicazioni pratiche delle funzioni <strong>LEAD, LAG, FIRST_VALUE, LAST_VALUE e NTH_VALUE()<\/strong> per accedere a punti dati specifici, analizzare tendenze e ricavare informazioni da dati sequenziali.<\/p>\n\n\n\n<p>Queste funzionalit\u00e0 sono preziose per gli analisti di dati e gli sviluppatori che lavorano con iSeries SQL, offrendo un approccio flessibile ed efficiente all&#8217;analisi dei dati.<\/p>\n\n\n\n<p>Tenere presente, come sempre, che l\u2019implementazione e le funzionalit\u00e0 effettive potrebbero variare a seconda della versione del sistema operativo iSeries e del database DB2.<\/p>\n\n\n\n<p>\u00c8 sempre buona norma fare riferimento alla documentazione ufficiale IBM per avere informazioni pi\u00f9 precise e dettagliate.<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>Riferimenti utili<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <a href=\"https:\/\/www.genesi-srl.com\/it\/data-science-opportunita-e-sfide-da-affrontare\/\" target=\"_blank\" rel=\"noreferrer noopener\">Data Science: opportunit\u00e0 e sfide da affrontare<\/a><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <a href=\"https:\/\/www.genesi-srl.com\/it\/funzioni-olap-in-data-science-un-approccio-moderno-alla-business-intelligence\/\" target=\"_blank\" rel=\"noreferrer noopener\">Funzioni OLAP in Data Science: un approccio moderno alla Business Intelligence<\/a><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.skillup.cloud\/it\/sfruttare-il-potere-della-data-science-e-sql-con-olap-functions-su-ibm-iseries\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sfruttare il Potere della Data Science e SQL con OLAP Functions su IBM iSeries<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Nel regno dell&#8217;analisi e della gestione dei dati sui sistemi IBM iSeries, SQL offre un potente insieme di strumenti progettati per migliorare l&#8217;efficienza e la profondit\u00e0 dell&#8217;interrogazione dei dati. Tra questi strumenti, le funzioni OLAP (Online Analytical Processing) spiccano per&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4520,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[253,275],"tags":[46,255,256,257,260],"class_list":["post-4512","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-science","category-artificial-intelligence","tag-sql","tag-data-science","tag-business-intelligence","tag-olap-online-analytical-processing","tag-window-functions"],"_links":{"self":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/comments?post=4512"}],"version-history":[{"count":11,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4512\/revisions"}],"predecessor-version":[{"id":4543,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4512\/revisions\/4543"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media\/4520"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media?parent=4512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/categories?post=4512"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/tags?post=4512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}