Zak niet door het ijs met je data

Sjoerd Meeuwsen over ‘distinct’ in Qlik Sense

Zak niet door het ijs met je data.. Wat bedoel ik daar precies mee? Het natuurijs is aan het smelten en bij HippoLine maken we de balans op. Wie van ons heeft de langste afstand afgelegd op het ijs? Wij hadden alle drie een tag op zak. Ik heb de data in een dashboard gezet en ik bleek te hebben verloren. Dat kan niet! Wat is er gebeurd?

Dit is de data van de tags:

En het resultaat als ik het samenvoeg in Qlik Sense:

En dat is vreemd! Marijn, mijn collega, is nu de winnaar met de meeste kilometers en bij mij staat slechts één keer de 40 kilometer opgenomen. Hoe kan dit?

Qlik is goed om uit (rommelige) data sets de unieke records in te laden, met als groot voordeel geen dubbele records meer. Dit doe je door het toepassen van ‘distinct’ in het script.

Voor samenvoegen van de twee tabellen heb ik gekozen voor een join, hierbij moet ik opletten dat ik de namen van de schaatsers uniek koppel aan de afstanden; ik wil de tag van Marijn niet dubbel koppelen waardoor hij twee keer zo veel zou schaatsen. Je zou hierbij kunnen denken aan een left join in combinatie met een distinct:

Ik laad eerst de afstanden in, vervolgens laad ik distinct de namen eraan. Gaat dit goed? Nee! Je zou misschien denken dat de distinct alleen van toepassing is op de waarden die erbij worden gejoined, maar dit is echter niet zo. Door distinct te joinen wordt ook de tabel waarop gejoind wordt distinct. Omdat tag 3 twee keer dezelfde afstand (40) heeft afgelegd, wordt deze ook distinct. En raak je dus 40 kilometer kwijt!

Gelukkig zijn er twee oplossingen:

Oplossing 1: de tabel schaatsers distinct in een tijdelijke tabel laden en vervolgens deze tabel ‘normaal’ joinen aan resultaat.

Oplossing 2:
Maak de afstand tabel voor iedere regel uniek door een rowno()  toe te voegen als extra dimensie.

Als ik één van de twee oplossingen gebruik, kom ik tot de juiste tabel; alle afstanden door de tags met de juiste namen erbij.

Uiteraard zou ik nog kunnen sommeren om per schaatser de totale som te krijgen, maar dat laat ik in dit voorbeeld achterwege.

Wat leren wij nu van dit korte voorbeeld? Let goed op als je een distinct load gebruikt op tabellen waarbij op enig moment een join of concatenate wordt gebruikt.  Ergens één distinct opnemen zorgt ervoor dat alle direct gerelateerde tabellen ook distinct worden geladen. Door eerst tijdelijke tabellen distinct te laden en deze vervolgens pas te joinen óf iedere rij uniek te maken van velden waarvan je niet wilt dat deze onterecht distinct worden gemaakt, is dit te voorkomen. In het voorbeeld is gewerkt met een join, maar het is ook van toepassing als wordt gewerkt met een concatenate.

Meer weten? Ik help je graag verder!

Sjoerd Meeuwsen, BI-specialist