Viac štatistík webu vo svojom malom úložisku

Analyzovaním štatistiky webovej stránky získavame prehľad o tom, čo sa na nej deje. Výsledky porovnávame s inými poznatkami o produkte alebo službe a tým zlepšujeme našu skúsenosť.

Keď je analýza prvých výsledkov ukončená, informácie sú spracované a sú urobené závery, začína nasledujúca fáza. Objavujú sa myšlienky: čo ak sa pozrieme na údaje z inej perspektívy?

V tejto fáze sú obmedzenia analytických nástrojov. To je jeden z dôvodov, prečo mi nestačil nástroj Google Analytics, a to najmä kvôli obmedzenej možnosti vidieť svoje údaje a manipulovať s nimi.

Vždy som chcel rýchlo načítať základné údaje (master data), pridať ďalšiu úroveň agregácie alebo inak interpretovať existujúce hodnoty.

Je to jednoduché urobiť v svojom malom úložisku na základe súboru access.log a na to stačí jazyk SQL.

Takže, na aké otázky som chcel nájsť odpoveď?

Čo a kedy sa na stránke menilo

História zmien základných údajov (master data) je vždy zaujímavá.

Viac štatistík webu vo svojom malom úložisku

SQL dotaz na report

SELECT
	1 as 'SideStackedBar: Obsahové aktualizácie podľa mesiacov',
	strftime('%m/%Y', datetime(UPDATE_DT, 'unixepoch')) AS 'Deň',
	COUNT(CASE WHEN PAGE_TITLE != 'n.a.' THEN DIM_REQUEST_ID END) AS 'Aktualizácie webových stránok',
	COUNT(CASE WHEN PAGE_DESCR = 'IMAGES' THEN DIM_REQUEST_ID END) AS 'Nahrávania obrázkov',
	COUNT(CASE WHEN PAGE_DESCR = 'VIDEO' THEN DIM_REQUEST_ID END) AS 'Nahrávania videí',
	COUNT(CASE WHEN PAGE_DESCR = 'AUDIO' THEN DIM_REQUEST_ID END) AS 'Nahrávania zvukov'
FROM DIM_REQUEST
WHERE PAGE_TITLE != 'n.a.' OR PAGE_DESCR != 'n.a.'
GROUP BY strftime('%m/%Y', datetime(UPDATE_DT, 'unixepoch'))
ORDER BY UPDATE_DT

Napríklad, v nejakom momente bola vykonaná optimalizácia pre vyhľadávače alebo bolo pridanej nové obsah na stránku, v dôsledku čoho sa očakáva zvýšenie prevádzky.

Skupiny používateľov

Najjednoduchším príkladom skupiny môže byť používateľská agentúra alebo názov operačného systému.

Meranie používateľských agentov zhromaždilo asi tisíc záznamov a zaujímalo ma vidieť dynamiku rozdelenia agentov v rámci skupiny.

Viac štatistík webu vo svojom malom úložisku

SQL dotaz na report

SELECT
	1 AS 'SideStackedBar: Používateľské agenti',
	AGENT_OS AS 'OS',
	SUM(CASE WHEN AGENT_BOT = 'n.a.' THEN 1 ELSE 0 END ) AS 'Používateľský agent používateľov',
	SUM(CASE WHEN AGENT_BOT != 'n.a.' THEN 1 ELSE 0 END ) AS 'Používateľský agent robotov'
FROM DIM_USER_AGENT
WHERE DIM_USER_AGENT_ID != -1
GROUP BY AGENT_OS
ORDER BY 3 DESC

Najviac rôznych kombinácií agentov prichádza na stránku zo sveta Windows. Medzi neidentifikované patrili také ako WhatsApp, PocketImageCache, PlayStation, SmartTV a podobne.

Aktivita skupín používateľov podľa týždňov

Spojením niektorých skupín je možné sledovať rozdelenie ich aktivity.

Napríklad používatelia Linuxového klastru spotrebujú viac premávky na stránke ako všetci ostatní.

Viac štatistík webu vo svojom malom úložisku

SQL dotaz na report

SELECT
1 as 'StackedBar: Objem premávky podľa používateľského OS a týždňa',
strftime('%W týždeň', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Týždeň',
SUM(CASE WHEN USG.AGENT_OS IN ('Android', 'Linux') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Používatelia Android/Linux',
SUM(CASE WHEN USG.AGENT_OS IN ('Windows') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Používatelia Windows',
SUM(CASE WHEN USG.AGENT_OS IN ('Macintosh', 'iOS') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Používatelia Mac/iOS',
SUM(CASE WHEN USG.AGENT_OS IN ('n.a.', 'BlackBerry') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Iné'
FROM
  FCT_ACCESS_USER_AGENT_DD FCT,
  DIM_USER_AGENT USG,
  DIM_HTTP_STATUS HST
WHERE FCT.DIM_USER_AGENT_ID = USG.DIM_USER_AGENT_ID
  AND FCT.DIM_HTTP_STATUS_ID = HST.DIM_HTTP_STATUS_ID
  AND USG.AGENT_BOT = 'n.a.' /* iba používatelia */
  AND HST.STATUS_GROUP IN ('Successful') /* dobré stránky */
  AND datetime(FCT.EVENT_DT, 'unixepoch') > date('now', '-3 month')
GROUP BY strftime('%W týždeň', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DT

Intenzívna spotreba premávky

Z tabuľky sú viditeľné najaktívnejšie skupiny používateľov a deň ich aktivity.
Najaktívnejšie patrí do Linuxového klastru.

Viac štatistík webu vo svojom malom úložisku

SQL dotaz na report

SELECT
1 AS 'Tabuľka: Používateľský agent s vysokou spotrebou',
strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Deň',
ROUND(1.0 * SUM(FCT.BYTES) / 1000000, 1) AS 'Premávka MB',
ROUND(1.0 * SUM(FCT.IP_CNT) / SUM(1), 1) AS 'IP',
ROUND(1.0 * SUM(FCT.REQUEST_CNT) / SUM(1), 1) AS 'Žiadosti',
USA.DIM_USER_AGENT_ID AS 'ID',
MAX(USA.USER_AGENT_NK) AS 'Používateľský agent',
MAX(USA.AGENT_BOT) AS 'Bot'
FROM
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USA
WHERE FCT.DIM_USER_AGENT_ID = USA.DIM_USER_AGENT_ID
  AND datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-30 day')
GROUP BY USA.DIM_USER_AGENT_ID, strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY SUM(FCT.BYTES) DESC, FCT.EVENT_DT
LIMIT 10

Použitím atribútov deň a ID agenta sa objavuje možnosť rýchlo nájsť a sledovať štatistiky podľa jednotlivých skupín používateľov. V prípade potreby je možné rýchlo nájsť podrobné informácie v stéžovej tabuľke.

Ako získať informácie?

Informácie z súboru access.log je možné urobiť ešte efektívnejšie, ak integrujeme ďalšie zdroje dát, zavedieme nové úrovne agregácie a skupinovania.

Základné údaje a entity

K základným údajom patrí informácia o entitách: webové stránky, obrázky, video a audio obsah, v prípade obchodu – produkty.

Samotné entity plnia úlohu dimenzií, pričom proces uchovávania zmien atribútov sa nazýva historizácia. V databáze sa tento proces často realizuje vo forme pomaly sa meniacich dimenzií (SCD).

Zdroje základných údajov môžu byť veľmi rôzne, preto je takmer vždy potrebné ich integrovať.

Pomaly sa mení dimenzia

Dimenzia DIM_REQUEST bude obsahovať informácie o požiadavkách na stránke v historickej forme.

Tabuľka SCD2

VYTVORTE TABUĽKU DIM_REQUEST ( /* scd tabuľka pre používateľské požiadavky */ DIM_REQUEST_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, DIM_REQUEST_ID_HIST INTEGER NOT NULL DEFAULT -1, REQUEST_NK TEXT NOT NULL DEFAULT 'n.a.', /* požiadavka bez ?parametrov */ PAGE_TITLE TEXT NOT NULL DEFAULT 'n.a.', PAGE_DESCR TEXT NOT NULL DEFAULT 'n.a.', PAGE_KEYWORDS TEXT NOT NULL DEFAULT 'n.a.', DELETE_FLAG INTEGER NOT NULL DEFAULT 0, UPDATE_DT INTEGER NOT NULL DEFAULT 0, UNIQUE (REQUEST_NK, DIM_REQUEST_ID_HIST)); INSERT INTO DIM_REQUEST (DIM_REQUEST_ID) VALUES (-1);

Navyše vytvoríme jedno zobrazenie, ktoré vždy zobrazuje všetky záznamy v poslednom stave. Je potrebné pre načítanie samotnej dimenzie.

Viac štatistík webu vo svojom malom úložisku

Aktuálne zobrazenie SCD2

/* Content: actual view on scd table */
SELECT HI.DIM_REQUEST_ID,
  HI.DIM_REQUEST_ID_HIST,
  HI.REQUEST_NK,
  HI.PAGE_TITLE,
  HI.PAGE_DESCR,
  HI.PAGE_KEYWORDS,
  NK.CNT AS HIST_CNT,
  HI.DELETE_FLAG,
  strftime('%d.%m.%Y %H:%M', datetime(HI.UPDATE_DT, 'unixepoch')) AS UPDATE_DT
FROM
  ( SELECT REQUEST_NK, MAX(DIM_REQUEST_ID) AS DIM_REQUEST_ID, SUM(1) AS CNT
    FROM DIM_REQUEST
    GROUP BY REQUEST_NK
  ) NK,
  DIM_REQUEST HI
WHERE 1 = 1
  AND NK.REQUEST_NK = HI.REQUEST_NK
  AND NK.DIM_REQUEST_ID = HI.DIM_REQUEST_ID;

A zobrazenie, kde je pre každý záznam zhromaždená historická informácia. Je potrebné na vytvorenie historicky presného prepojenia s faktami.

Viac štatistík webu vo svojom malom úložisku

Historické zobrazenie SCD2

/* Content: actual view on scd table */
SELECT SCD.DIM_REQUEST_ID,
  SCD.DIM_REQUEST_ID_HIST,
  SCD.REQUEST_NK,
  SCD.PAGE_TITLE,
  SCD.PAGE_DESCR,
  SCD.PAGE_KEYWORDS,
  SCD.DELETE_FLAG,
  CASE
    WHEN HIS.UPDATE_DT IS NULL
    THEN 1
    ELSE 0 END ACTIVE_FLAG,
  SCD.DIM_REQUEST_ID_HIST AS ID_FROM,
  SCD.DIM_REQUEST_ID AS ID_TO,
  CASE
    WHEN SCD.DIM_REQUEST_ID_HIST=-1
    THEN 3600
    ELSE IFNULL(SCD.UPDATE_DT,3600)
  END AS TIME_FROM,
  CASE
    WHEN HIS.UPDATE_DT IS NULL
    THEN 253370764800
    ELSE HIS.UPDATE_DT
  END AS TIME_TO,
  CASE
    WHEN SCD.DIM_REQUEST_ID_HIST=-1
    THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(3600, 'unixepoch'))
    ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(IFNULL(SCD.UPDATE_DT,3600), 'unixepoch'))
  END AS ACTIVE_FROM,
  CASE
    WHEN HIS.UPDATE_DT IS NULL
    THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(253370764800, 'unixepoch'))
    ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(HIS.UPDATE_DT, 'unixepoch'))
  END AS ACTIVE_TO
FROM
  DIM_REQUEST SCD
  LEFT OUTER JOIN DIM_REQUEST HIS
  ON SCD.REQUEST_NK = HIS.REQUEST_NK AND SCD.DIM_REQUEST_ID = HIS.DIM_REQUEST_ID_HIST;

Agregácia údajov

Kompresia (agregácia) umožňuje posúdiť údaje na vyššej úrovni a odhaliť anomálie a trendy, ktoré nie sú viditeľné v podrobných správach.

Napríklad do dimenzie s kódmi stavov požiadaviek DIM_HTTP_STATUS pridáme skupinu:

STATUS / GROUP
0xx / n.a.
1xx / Informačný
2xx / Úspešný
3xx / Presmerovanie
4xx / Chyba klienta
5xx / Chyba servera

Dimenzia používateľských agentov DIM_USER_AGENT bude obsahovať atribúty AGENT_OS a AGENT_BOT, ktoré sú zodpovedné za skupiny. Môžu sa vyplniť počas ETL:

Načítanie DIM_USER_AGENT

/* Propagate the user agent from access log */
INSERT INTO DIM_USER_AGENT (USER_AGENT_NK, AGENT_OS, AGENT_ENGINE, AGENT_DEVICE, AGENT_BOT, UPDATE_DT)
WITH CLS AS (
	SELECT BROWSER
	FROM STG_ACCESS_LOG WHERE LENGTH(BROWSER)>1
	GROUP BY BROWSER
)
SELECT
	CLS.BROWSER AS USER_AGENT_NK,
	CASE
	WHEN INSTR(CLS.BROWSER,'Macintosh')>0
		THEN 'Macintosh'
	WHEN INSTR(CLS.BROWSER,'iPhone')>0
			 OR INSTR(CLS.BROWSER,'iPad')>0
			 OR INSTR(CLS.BROWSER,'iPod')>0
			 OR INSTR(CLS.BROWSER,'Apple TV')>0
			 OR INSTR(CLS.BROWSER,'Darwin')>0
		THEN 'iOS'
	WHEN INSTR(CLS.BROWSER,'Android')>0
		THEN 'Android'
	WHEN INSTR(CLS.BROWSER,'X11;')>0 OR INSTR(CLS.BROWSER,'Wayland;')>0 OR INSTR(CLS.BROWSER,'linux-gnu')>0
		THEN 'Linux'
	WHEN INSTR(CLS.BROWSER,'BB10;')>0 OR INSTR(CLS.BROWSER,'BlackBerry')>0
		THEN 'BlackBerry'
	WHEN INSTR(CLS.BROWSER,'Windows')>0
		THEN 'Windows'
	ELSE 'n.a.' END AS AGENT_OS, -- OS
	CASE
	WHEN INSTR(CLS.BROWSER,'AppleCoreMedia')>0
		THEN 'AppleWebKit'
	WHEN INSTR(CLS.BROWSER,') ')>1 AND LENGTH(CLS.BROWSER)>INSTR(CLS.BROWSER,') ')
		THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,') ')+2, LENGTH(CLS.BROWSER) - INSTR(CLS.BROWSER,') ')-1), 'N/A')
	ELSE 'n.a.' END AS AGENT_ENGINE, -- Engine
	CASE
	WHEN INSTR(CLS.BROWSER,'iPhone')>0
		THEN 'iPhone'
	WHEN INSTR(CLS.BROWSER,'iPad')>0
		THEN 'iPad'
	WHEN INSTR(CLS.BROWSER,'iPod')>0
		THEN 'iPod'
	WHEN INSTR(CLS.BROWSER,'Apple TV')>0
		THEN 'Apple TV'
	WHEN INSTR(CLS.BROWSER,'Android ')>0 AND INSTR(CLS.BROWSER,'Build')>0
		THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'Build')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')
	WHEN INSTR(CLS.BROWSER,'Android ')>0 AND INSTR(CLS.BROWSER,'MIUI')>0
		THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'MIUI')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')
	ELSE 'n.a.' END AS AGENT_DEVICE, -- Device
	CASE
	WHEN INSTR(LOWER(CLS.BROWSER),'yandex.com')>0
		THEN 'yandex'
	WHEN INSTR(LOWER(CLS.BROWSER),'googlebot')>0
		THEN 'google'
	WHEN INSTR(LOWER(CLS.BROWSER),'bingbot')>0
		THEN 'microsoft'
	WHEN INSTR(LOWER(CLS.BROWSER),'ahrefsbot')>0
		THEN 'ahrefs'
	WHEN INSTR(LOWER(CLS.BROWSER),'jobboersebot')>0 OR INSTR(LOWER(CLS.BROWSER),'jobkicks')>0
		THEN 'job.de'
	WHEN INSTR(LOWER(CLS.BROWSER),'mail.ru')>0
		THEN 'mail.ru'
	WHEN INSTR(LOWER(CLS.BROWSER),'baiduspider')>0
		THEN 'baidu'
	WHEN INSTR(LOWER(CLS.BROWSER),'mj12bot')>0
		THEN 'majestic-12'
	WHEN INSTR(LOWER(CLS.BROWSER),'duckduckgo')>0
		THEN 'duckduckgo'
	WHEN INSTR(LOWER(CLS.BROWSER),'bytespider')>0
		THEN 'bytespider'
	WHEN INSTR(LOWER(CLS.BROWSER),'360spider')>0
		THEN 'so.360.cn'
	WHEN INSTR(LOWER(CLS.BROWSER),'compatible')>0 OR INSTR(LOWER(CLS.BROWSER),'http')>0
		OR INSTR(LOWER(CLS.BROWSER),'libwww')>0 OR INSTR(LOWER(CLS.BROWSER),'spider')>0
		OR INSTR(LOWER(CLS.BROWSER),'java')>0 OR INSTR(LOWER(CLS.BROWSER),'python')>0
		OR INSTR(LOWER(CLS.BROWSER),'robot')>0 OR INSTR(LOWER(CLS.BROWSER),'curl')>0 OR INSTR(LOWER(CLS.BROWSER),'wget')>0
		THEN 'other'
	ELSE 'n.a.' END AS AGENT_BOT, -- Bot
	STRFTIME('%s','now') AS UPDATE_DT
FROM CLS
LEFT OUTER JOIN DIM_USER_AGENT TRG
ON CLS.BROWSER = TRG.USER_AGENT_NK
WHERE TRG.DIM_USER_AGENT_ID IS NULL

Integrácia údajov

Zahŕňa organizáciu prenosu údajov z operačného systému do reportu. Na to je potrebné vytvoriť stážovú tabuľku so štruktúrou podobnou zdroju.

Do stážových údajov o webových stránkach sa dostáva zo zálohy CMS vo forme vkladacích požiadaviek.

Načítanie historickej tabuľky DIM_REQUEST základnými údajmi prebieha v troch krokoch: načítanie nových kľúčov a atribútov, aktualizácia existujúcich a zafixovanie odstránených záznamov.

Načítanie nových záznamov SCD2

/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS  AS ( -- prepare keys
	SELECT
	'/' || NAME AS REQUEST_NK,
	TITLE       AS PAGE_TITLE,
	CASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL
	     THEN 'n.a.' ELSE DESCRIPTION
	END AS PAGE_DESCR,
	CASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL
	     THEN 'n.a.' ELSE KEYWORDS
	END AS PAGE_KEYWORDS
	FROM STG_CMS_MENU
	WHERE CONTENT_TYPE != 'folder' -- only web pages
	  AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/* new records from stage: CLS */
SELECT
	-1 AS DIM_REQUEST_ID_HIST,
	CLS.REQUEST_NK,
	CLS.PAGE_TITLE,
	CLS.PAGE_DESCR,
	CLS.PAGE_KEYWORDS,
	0 AS DELETE_FLAG,
	STRFTIME('%s','now') AS UPDATE_DT
FROM CLS
LEFT OUTER JOIN
 (
	SELECT
	DIM_REQUEST_ID,
	REQUEST_NK,
	PAGE_TITLE,
	PAGE_DESCR,
	PAGE_KEYWORDS
	FROM DIM_REQUEST_V_ACT
) TRG ON CLS.REQUEST_NK = TRG.REQUEST_NK
WHERE TRG.REQUEST_NK IS NULL -- no such record in data mart

Aktualizácia atribútov SCD2

/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS  AS ( -- prepare keys
	SELECT
	'/' || NAME AS REQUEST_NK,
	TITLE       AS PAGE_TITLE,
	CASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL
	     THEN 'n.a.' ELSE DESCRIPTION
	END AS PAGE_DESCR,
	CASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL
	     THEN 'n.a.' ELSE KEYWORDS
	END AS PAGE_KEYWORDS
	FROM STG_CMS_MENU
	WHERE CONTENT_TYPE != 'folder' -- only web pages
	  AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/* updated records from stage: CLS and build reference to history: HIST */
SELECT
	HIST.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,
	HIST.REQUEST_NK,
	CLS.PAGE_TITLE,
	CLS.PAGE_DESCR,
	CLS.PAGE_KEYWORDS,
	0 AS DELETE_FLAG,
	STRFTIME('%s','now') AS UPDATE_DT
FROM CLS,
     DIM_REQUEST_V_ACT TRG,
     DIM_REQUEST HIST
WHERE CLS.REQUEST_NK = TRG.REQUEST_NK
  AND TRG.DIM_REQUEST_ID = HIST.DIM_REQUEST_ID
  AND ( CLS.PAGE_TITLE != HIST.PAGE_TITLE /* changes only */
     OR CLS.PAGE_DESCR != HIST.PAGE_DESCR
     OR CLS.PAGE_KEYWORDS != HIST.PAGE_KEYWORDS )

Odstránené záznamy SCD2

/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS  AS ( -- prepare keys
	SELECT
	'/' || NAME AS REQUEST_NK,
	TITLE       AS PAGE_TITLE
	FROM STG_CMS_MENU
	WHERE CONTENT_TYPE != 'folder' -- only web pages
	  AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/*  deleted records in data mart: TRG */
SELECT
	TRG.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,
	TRG.REQUEST_NK,
	TRG.PAGE_TITLE,
	TRG.PAGE_DESCR,
	TRG.PAGE_KEYWORDS,
	1 AS DELETE_FLAG,
	STRFTIME('%s','now') AS UPDATE_DT
FROM (
	SELECT
	DIM_REQUEST_ID,
	REQUEST_NK,
	PAGE_TITLE,
	PAGE_DESCR,
	PAGE_KEYWORDS
	FROM DIM_REQUEST_V_ACT
	WHERE PAGE_TITLE != 'n.a.' -- track master data only
	  AND DELETE_FLAG = 0 -- not already deleted
) TRG
LEFT OUTER JOIN CLS ON TRG.REQUEST_NK = CLS.REQUEST_NK
WHERE CLS.REQUEST_NK IS NULL -- no such record in stage

Každý zdroj údajov je potrebné sprevádzať formálnym popisom, napríklad v súbore readme.txt:

Prijímateľ údajov formálne/technicky: meno, e-mailová adresa
Poskytovateľ údajov formálne/technicky: meno, e-mailová adresa
Zdroj údajov: cesta k súboru, názvy služieb
Informácie o prístupe k údajom: používatelia a heslá

Schéma pohybu údajov pomôže v procese údržby a aktualizácie, napríklad v textovej podobe:

Pohyb súboru. Zdroj: ftp.domain.net:/logs/access.log Cieľ: /var/www/access.log
Čítanie do stáž. Cieľ: STG_ACCESS_LOG
Načítanie a transformácia. Cieľ: FCT_ACCESS_REQUEST_REF_HH
Načítanie a transformácia. Cieľ: FCT_ACCESS_USER_AGENT_DD
Správa. Cieľ: /var/www/report.html

Záver

Týmto spôsobom článok popisuje mechanizmy, ako sú integrácia základných údajov a zavádzanie nových úrovní agregácie. Tieto sú potrebné pri budovaní dátových skladov s cieľom získania dodatočných poznatkov a zlepšenia kvality informácií.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster