Rohkem veebisaidi statistikat oma vÀikeses hoidlates

AnalĂŒĂŒsides saidi statistikat, saame ĂŒlevaate sellest, mis sellel toimub. Tulemusi seostatakse teiste teadmistega tootest vĂ”i teenusest ning see parandab meie kogemust.

Kui esimese analĂŒĂŒsi tulemused on lĂ”ppenud, on teave mĂ”istetud ja jĂ€reldused tehtud, algab jĂ€rgmine etapp. Tekivad ideed: mis juhtuks, kui vaadata andmeid teisest kĂŒljest?

Sellel etapil on analĂŒĂŒsitööriistadega piirangud. See on ĂŒks pĂ”hjus, miks Google Analytics ei olnud mulle piisav tööriist, kuna sellel on piiratud vĂ”imalus nĂ€ha oma andmeid ja nendega manipuleerida.

Olen alati soovinud kiiresti laadida pÔhiteavet (master-datas), lisada teisest tasemest koondust vÔi tÔlgendada olemasolevaid vÀÀrtusi muul moel.

Seda on lihtne teha oma vÀikestes andmehoidlas access.log faili pÔhjal ja selleks on piisav SQL keel.

Nii et millistele kĂŒsimustele ma tahtsin vastuseid leida?

Mis ja millal saidil muutus

PÔhiteabe (master-data) muudatuste ajalugu on alati huvitav.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

SQL aruanne

SELECT
	1 as 'SideStackedBar: Sisu uuendamise kuudega',
	strftime('%m/%Y', datetime(UPDATE_DT, 'unixepoch')) AS 'PĂ€ev',
	COUNT(CASE WHEN PAGE_TITLE != 'n.a.' THEN DIM_REQUEST_ID END) AS 'Veebilehe uuendused',
	COUNT(CASE WHEN PAGE_DESCR = 'IMAGES' THEN DIM_REQUEST_ID END) AS 'Pildi ĂŒleslaamised',
	COUNT(CASE WHEN PAGE_DESCR = 'VIDEO' THEN DIM_REQUEST_ID END) AS 'Video ĂŒleslaamised',
	COUNT(CASE WHEN PAGE_DESCR = 'AUDIO' THEN DIM_REQUEST_ID END) AS 'Heli ĂŒleslaamised'
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

NÀiteks, mÔnel hetkel tehti saidi otsingumootori optimeerimist vÔi lisati uusi sisu ning seetÔttu oodatakse liikluse suurenemist.

Kasutajagruppide

Lihtsaimaksemiseks kasutajagrupiks vĂ”ib olla kasutajaagent vĂ”i operatsioonisĂŒsteemi nimetus.

Kasutajaagentide mÔÔtmine on kogunud umbes tuhat salvestust ning mind huvitab, kuidas on agentide jaotus grupi piires.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

SQL aruanne

SELECT
	1 AS 'SideStackedBar: Kasutajaagendid',
	AGENT_OS AS 'OS',
	SUM(CASE WHEN AGENT_BOT = 'n.a.' THEN 1 ELSE 0 END ) AS 'Kasutajaagentide kasutajad',
	SUM(CASE WHEN AGENT_BOT != 'n.a.' THEN 1 ELSE 0 END ) AS 'Kasutajaagentide robotid'
FROM DIM_USER_AGENT
WHERE DIM_USER_AGENT_ID != -1
GROUP BY AGENT_OS
ORDER BY 3 DESC

Suurim arv erinevaid agentide kombinatsioone tuleb saidile Windowsi maailmast. MÀÀratlemata on sellised, nagu WhatsApp, PocketImageCache, PlayStation, SmartTV jne.

Kasutajagruppide aktiivsus nÀdalate lÔikes

MĂ”ned gruppide ĂŒhendamisega on vĂ”imalik jĂ€lgida nende aktiivsuse jaotust.

NÀiteks kasutavad Linuxi klusteri kasutajad veebisaiti rohkem kui kÔik teised.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

SQL aruanne

SELECT
1 AS 'StackedBar: KĂŒlastuste maht kasutaja operatsioonisĂŒsteemi ja nĂ€dala kohta',
strftime('%W nÀdal', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'NÀdal',
SUM(CASE WHEN USG.AGENT_OS IN ('Android', 'Linux') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Androidi/Linuxi kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('Windows') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Windowsi kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('Macintosh', 'iOS') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Mac/iOS kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('n.a.', 'BlackBerry') THEN FCT.BYTES ELSE 0 END) / 1000 AS 'Muud'
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.' /* ainult kasutajad */
  AND HST.STATUS_GROUP IN ('Edulood') /* head lehed */
  AND datetime(FCT.EVENT_DT, 'unixepoch') > date('now', '-3 month')
GROUP BY strftime('%W nÀdal', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DT

Intensiivne liikluse tarbimine

Tabelist on nĂ€ha kĂ”ige aktiivsemad kasutajagruppide rĂŒhmad ja nende aktiivsuse pĂ€ev.
KÔige aktiivsemad kuuluvad Linuxi klastrisse.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

SQL aruanne

SELECT
1 AS 'Tabel: Kasutajaagent kÔrge kasutusega',
strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'PĂ€ev',
ROUND(1.0 * SUM(FCT.BYTES) / 1000000, 1) AS 'Liiklus MB',
ROUND(1.0 * SUM(FCT.IP_CNT) / SUM(1), 1) AS 'IP-d',
ROUND(1.0 * SUM(FCT.REQUEST_CNT) / SUM(1), 1) AS 'PĂ€ringud',
USA.DIM_USER_AGENT_ID AS 'ID',
MAX(USA.USER_AGENT_NK) AS 'Kasutajaagent',
MAX(USA.AGENT_BOT) AS 'Robot'
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

Kasutades pÀeva ja agendi ID atribuute, on vÔimalik kiiresti leida ja jÀlgida statistikat pÀeva jÀrgi eraldi kasutajagruppide kohta. Vajadusel saab kiiresti leida detailsed andmed stseenitabelist.

Kuidas infot saada?

Teavet failist access.log saab teha veelgi efektiivsemaks, kui integreerida tÀiendavad andmeallikad, luua uusi tasemeid agregatsiooni ja gruppeerimise jaoks.

PÔhiandmed ja entiteedid

PÔhiandmed hÔlmavad teavet entiteetide kohta: veebilehed, pildid, videod ja heli sisu, kaupluse puhul - tooted.

Entiteedid toimivad mÔÔtmetena, samas kui atribuutide muutuste salvestamise protsessi nimetatakse ajalooliseks. Andmebaasis rakendatakse seda protsessi sageli aeglaselt muutuva mÔÔtmena (SCD).

PĂ”hiandmete allikad vĂ”ivad olla vĂ€ga erinevad sĂŒsteemid, seega on peaaegu alati vajalikud nende integreerimist.

Aeglaselt muutuva mÔÔtme

MÔÔde DIM_REQUEST sisaldab teavet veebisaidi pÀringute kohta ajaloolises vormis.

SCD2 tabel

Loo tabel DIM_REQUEST ( 
  DIM_REQUEST_ID      INTEGER EI OLEKUL PRIMARY KEY AUTOINCREMENT,
  DIM_REQUEST_ID_HIST INTEGER EI OLEKUL DEFAULT -1,
  REQUEST_NK          TEXT EI OLEKUL DEFAULT 'n.a.', 
  PAGE_TITLE          TEXT EI OLEKUL DEFAULT 'n.a.',
  PAGE_DESCR          TEXT EI OLEKUL DEFAULT 'n.a.',
  PAGE_KEYWORDS       TEXT EI OLEKUL DEFAULT 'n.a.',
  DELETE_FLAG         INTEGER EI OLEKUL DEFAULT 0,
  UPDATE_DT           INTEGER EI OLEKUL DEFAULT 0,
  UNIQUE (REQUEST_NK, DIM_REQUEST_ID_HIST)
);
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID) VALUES (-1);

Lisaks sellele loome ĂŒhe vaate, mis alati kuvab kĂ”ik kirjed viimases olekus. See on vajalik mÔÔtmise laadimiseks.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

Aktuaalne SCD2 vaade

/* 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;

Ja vaade, kus iga kirje jaoks on kogutud ajalooline teave. See on vajalik ajalooliselt tÀpse seose loomiseks faktidega.

Rohkem veebisaidi statistikat oma vÀikeses hoidlates

Ajalooline SCD2 vaade

/* 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;

Andmete aggregeerimine

Ajamise (aggregeerimise) abil on vÔimalik hinnata andmeid kÔrgemal tasemel ja avastada anomaaliaid ning suundi, mis ei ole detailses aruandes nÀhtavad.

NÀiteks lisame mÔÔtmisse DIM_HTTP_STATUS staatuste koodide grupi:

STATUS / GROUP
0xx / n.a.
1xx / Informatiivne
2xx / Edutav
3xx / Suunamine
4xx / Kliendi viga
5xx / Serveri viga

Kasutajaagentide mÔÔtmine DIM_USER_AGENT sisaldab atribuute AGENT_OS ja AGENT_BOT, mis vastutavad gruppide eest. Need saab tÀita ETL protsessi kÀigus:

DIM_USER_AGENTi laadimine

/* 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

Andmete integreerimine

See hĂ”lmab andmete edastamise korraldamist operatsioonisĂŒsteemist aruandesse. Selleks tuleb luua etapi tabel struktuuriga, mis on sarnane allikale.

Etapis satub teave veebilehtede kohta CMS-i varukoopiast sisestamissoovide vormis.

Ajaloolise tabeli DIM_REQUEST laadimine pÔhiteabega toimub kolmes etapis: uute vÔtmete ja atribuutide laadimine, olemasolevate vÀrskendamine ja kustutatud kirje sÀilitamine.

Uute kirjete laadimine 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

SCD2 atribuutide vÀrskendamine

/* 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 )

Kustutatud kirjed 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

Iga andmeallika juurde tuleb lisada ametlik kirjeldus, nÀiteks failis readme.txt:

Andmete saaja ametlikult/tehniliselt: nimi, e-posti aadress
Andmete pakkumise ametlikult/tehniliselt: nimi, e-posti aadress
Andmeallikas: faili tee, teenuste nimed
Teave andmetele juurdepÀÀsu kohta: kasutajad ja paroolid

Andmete liikumise skeem aitab hooldamise ja vÀrskendamise protsessis, nÀiteks tekstivormingus:

Faili liikumine. Allikas: ftp.domain.net: /logs/access.log Siht: /var/www/access.log
Lugemine etapis. Siht: STG_ACCESS_LOG
Laadimine ja transformatsioon. EesmÀrk: FCT_ACCESS_REQUEST_REF_HH
Laadimine ja transformatsioon. EesmÀrk: FCT_ACCESS_USER_AGENT_DD
Aruanne. EesmÀrk: /var/www/report.html

KokkuvÔte

Seega kirjeldab artikkel selliseid mehhanisme nagu baasandmete integreerimine ja uute agregatsioonitasemete rakendamine. Need on vajalikud andmehoidlate loomisel, et saada lisateavet ja parandada teabe kvaliteeti.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster