|
SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
|
Alati teme | Način prikaza |
26. 12. 2011. | #1 |
Knowledge base
Wrote a book
Datum učlanjenja: 07.06.2005
Lokacija: Neđe ođe...
Poruke: 1.197
Hvala: 339
688 "Hvala" u 178 poruka
|
Nalaženje nedostajućih datuma u nizu
Dobar dan
Imam tabelu sa hiljadama upisa koji bi trebali biti unošeni svakog dana u zadnjih nekoliko godina. Pojednostavljena tabela bi imala kolone: datum_unosa | podatak | tip_unosa Znači, trebalo bi da su ovi podaci unošeni svakodnevno tj. da kolona datum_unosa sadrži svaki dan za bilo koji datumski interval, ali ima ponegdje datuma za koje unos (svaki ili samo za određeni tip_unosa) nedostaje. Kako ih naći? Ovo sam uspio da riješim seljačkim metodom pravljenja privremene tabele sa svim datumima u nizu, pa left join sa ovom postojećom tabelom po datumu, pa još jedan select nad svim tim... Neki prefinjeniji metod?
__________________
Чак Норис може да си ги врзе врвките на чевлите со стапалата. |
26. 12. 2011. | #2 |
Ivan Dilber
Sir Write-a-Lot
|
a bas moras SQL upitom? Mozes naprosto da dohvatis sve datume u bazi sa
SELECT ... GROUP BY datum ORDER BY datum pa da onda u petlji kad fetchujes rezultat proveris da li fali neki datum.
__________________
Leadership is the art of getting people to want to do what you know must be done. |
26. 12. 2011. | #3 |
Knowledge base
Wrote a book
Datum učlanjenja: 07.06.2005
Lokacija: Neđe ođe...
Poruke: 1.197
Hvala: 339
688 "Hvala" u 178 poruka
|
Ono, problem je suštinski riješen, kao što rekoh (naravno, po PS-u je u kod dodat i komentar "temporary solution" ) nego pitam više zbog umne gimnastike
__________________
Чак Норис може да си ги врзе врвките на чевлите со стапалата. |
26. 12. 2011. | #4 | |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Citat:
BTW, šta će ti taj select nad svim tim? Zar LEFT JOIN sa "WHERE datumi.datum IS NULL" ne rešava stvar?
__________________
blog |
|
"Hvala" jablan za poruku: |
26. 12. 2011. | #5 |
Branimir Momcilovic
Qualified
Datum učlanjenja: 15.02.2006
Lokacija: Beograd
Poruke: 167
Hvala: 47
25 "Hvala" u 8 poruka
|
Datumska dimenzija, uobičajeno DimTime ili DimDate, je standardna u Data Warehouse rešenjima. Doduše korisna je i za druge stvari sem "popunjavanja" datuma gde nije bilo transakcija, npr. za hijerarhije, tipa godina - mesec - dan u mesecu i sve ostalo što datumske funkcije ne mogu ili teško mogu da izvedu, npr. neradni dani po lokalnom zakonodavstvu...
Svako drugo rešenje podrazumeva neku vrstu for petlje kroz slogove po redosledu, što nije u duhu sql-a, ali je svakako izvodljivo u jezicima opšte namene, kao što je opisao ivanhoe.
__________________
Važnije je biti ljubazan, nego biti u pravu. |
2 članova zahvaljuje BraMom za poruku: |
26. 12. 2011. | #6 | |
Knowledge base
Wrote a book
Datum učlanjenja: 07.06.2005
Lokacija: Neđe ođe...
Poruke: 1.197
Hvala: 339
688 "Hvala" u 178 poruka
|
Citat:
BraMom (i ti Jablane ), možete li još malo napisati o ovome? Kako se pravi npr. datumska dimenzija? I kako se popunjava - svi datumi za period tokom kojeg se baza koristila ili nekako drugačije?
__________________
Чак Норис може да си ги врзе врвките на чевлите со стапалата. Poslednja izmena od Milos Vukotic : 26. 12. 2011. u 23:02. |
|
27. 12. 2011. | #7 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Ima masa članaka na tu temu, vidi Search Google: sql calendar table pa dalje. Ja obično popunim za 10-ak godina unapred i unazad.
__________________
blog |
2 članova zahvaljuje jablan za poruku: |
27. 12. 2011. | #8 |
Branimir Momcilovic
Qualified
Datum učlanjenja: 15.02.2006
Lokacija: Beograd
Poruke: 167
Hvala: 47
25 "Hvala" u 8 poruka
|
Da kao što je jablan napisao, kreiraš tabelu pa je napuniš vrednostima, može i iz excela ako hoćeš. Konkretno ovo što koristim na MSSQL-u izgleda ovako:
Kôd:
CREATE TABLE [dbo].[DimDate]( [DimDateId] [int] IDENTITY(1,1) NOT NULL, [Period] [int] NOT NULL, [Date] [date] NOT NULL, [Year] [int] NULL, [Month] [int] NULL, [Week] [int] NULL, [SundayWeek] [int] NULL, [DayOfMonth] [int] NULL, [DayOfWeek] [int] NULL, [Quarter] [int] NULL, [DayName] [nvarchar](50) NULL, [MonthName] [nvarchar](50) NULL, CONSTRAINT [PK_DimDate] PRIMARY KEY CLUSTERED ( [DimDateId] ASC ) ON [PRIMARY] ) ON [PRIMARY] Kôd:
CREATE PROCEDURE [dbo].[GetDimDate] @startDate DATETIME, @endDate DATETIME AS BEGIN DECLARE @date DATETIME = @startDate SET DATEFIRST 1 CREATE TABLE #dateDimension( [Period] [int] NOT NULL, [Date] [date] NOT NULL, [Year] [int] NULL, [Month] [int] NULL, [Week] [int] NULL, [DayOfMonth] [int] NULL, [DayOfWeek] [int] NULL ) WHILE (@date < @endDate) BEGIN INSERT INTO #dateDimension VALUES (DATEPART(YEAR, @date), @date, DATEPART(YEAR, @date), DATEPART(MONTH, @date), DATEPART(WEEK, @date), DATEPART(DAY, @date), DATEPART(WEEKDAY, @date) ) SET @date = DATEADD(DAY, 1, @date) END SELECT * FROM #dateDimension DROP TABLE #dateDimension END Dobar primer dimenzionog modela za Data Warehouse je Microsoftov AdventureWorksDW, tabela se zove DimTime, možeš da skineš bazu sa codeplex-a, mislim da je skriptovana, tako da uopšte ne moraš da instaliraš MSSQL: http://sqlserversamples.codeplex.com/
__________________
Važnije je biti ljubazan, nego biti u pravu. |
"Hvala" BraMom za poruku: |
|
|