Het gebruik bestaat om te ontdekken of een product met een specifieke SKU bestaat
exists(array<T>, function<T, boolean>): boolean
In het bovenstaande fragment wordt de functie exists
toegepast op elk element van de array en wordt een booleaanse waarde geretourneerd. De booleaanse waarde geeft aan of er een of meer elementen in de array zijn die aan een opgegeven voorwaarde voldoen. In dit geval wordt bevestigd of een product met een specifieke SKU bestaat.
Voorbeeld
In het onderstaande SQL-voorbeeld haalt de query productListItems
op van de geometrixxx_999_xdm_pqs_1batch_10k_rows
-tabel en evalueert deze of een element met een SKU gelijk aan 123679
in de productListItems
-array bestaat. Vervolgens worden de resultaten gefilterd op basis van een specifieke reeks tijdstempels en worden de uiteindelijke resultaten beperkt tot tien rijen.
SELECT productListItems
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE EXISTS( productListItems, value -> value.sku == 123679)
AND timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')limit 10;
Resultaat
De resultaten voor deze SQL zouden vergelijkbaar zijn met die hieronder worden weergegeven.
productListItems
-----------------
{(123679, NULL,NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL,NULL)}
{(123679,NULL, NULL)}
(10 rows)
Filter gebruiken om producten te zoeken waarbij de SKU > 100000
filter(array<T>, function<T, boolean>): array<T>
Deze functie filtert een array met elementen op basis van een bepaalde voorwaarde die elk element als een booleaanse waarde evalueert. Vervolgens wordt een nieuwe array geretourneerd die alleen elementen bevat waar de voorwaarde een werkelijke waarde heeft geretourneerd.
Voorbeeld
Met de onderstaande query wordt de kolom productListItems
geselecteerd, wordt een filter toegepast om alleen elementen met een SKU groter dan 100000 op te nemen en wordt de resultaatset beperkt tot rijen binnen een specifiek tijdstempelbereik. De gefilterde array wordt vervolgens als _filter
in de uitvoer gealiased.
SELECT productListItems,
Filter(productListItems, value -> value.sku > 100000) AS _filter
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > To_timestamp('2017-11-01 00:00:00')
AND timestamp < To_timestamp('2017-11-02 00:00:00')
LIMIT 10;
Resultaat
De resultaten voor deze SQL zouden vergelijkbaar zijn met die hieronder worden weergegeven.
productListItems | _filter
-----------------+---------
(123679, NULL, NULL) (123679, NULL, NULL)
(1346, NULL, NULL) |
(98347, NULL, NULL) |
(176015, NULL, NULL) | (176015, NULL, NULL)
(10 rows)
Samenvoegen gebruiken om de SKU's van alle items in de productlijst die aan een specifieke id zijn gekoppeld, op te tellen en het resulterende totaal te verdubbelen
aggregate(array<T>, A, function<A, T, A>[, function<A, R>]): R
Deze statistische bewerking past een binaire operator toe op een begintoestand en alle elementen in de array. Het vermindert ook veelvoudige waarden tot één enkele staat. Na deze reductie wordt de uiteindelijke status omgezet in het uiteindelijke resultaat met behulp van een afwerkingsfunctie. De afwerkingsfunctie neemt de laatste status verkregen na het toepassen van de binaire operator op alle arrayelementen en doet er iets mee om het eindresultaat te produceren.
Voorbeeld
In dit queryvoorbeeld wordt de maximale SKU-waarde berekend uit de array productListItems
binnen het opgegeven tijdstempelbereik en wordt het resultaat verdubbeld. De uitvoer bevat de oorspronkelijke productListItems
-array en de berekende max_value
.
SELECT productListItems,
aggregate(productListItems, 0, (acc, value) ->
case
WHEN (
value.sku > acc) THEN cast(value.sku AS int)
ELSE cast(acc AS int)
END, acc -> acc * 2) AS max_value
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')
LIMIT 50;
Resultaat
De resultaten voor deze SQL zouden vergelijkbaar zijn met die hieronder worden weergegeven.
productListItems | max_value
-----------------+---------
(123679, NULL, NULL) | 247358
(1346,NULL, NULL) | 2692
(98347, NULL, NULL) | 196694
(176015, NULL, NULL) | 352030
(10 rows)
ZIP_with gebruiken om een volgnummer toe te wijzen aan alle items in de productlijst
zip_with(array<T>, array<U>, function<T, U, R>): array<R>
Dit fragment combineert de elementen van twee arrays tot één nieuwe array. De bewerking wordt onafhankelijk uitgevoerd op elk element van de array en genereert waardeparen. Als één array korter is, worden null-waarden toegevoegd om overeen te komen met de lengte van de langere array. Dit gebeurt voordat de functie wordt toegepast.
Voorbeeld
De volgende query gebruikt de functie zip_with
om paren waarden te maken van twee arrays. Dit gebeurt door de SKU-waarden van de array productListItems
toe te voegen aan een reeks gehele getallen, die is gegenereerd met de functie Sequence
. Het resultaat wordt samen met de oorspronkelijke kolom productListItems
geselecteerd en is beperkt op basis van een tijdstempelbereik.
SELECT productListItems,
zip_with(Sequence(1,5), Transform(productListItems, p -> p.sku), (x,y) -> struct(x, y)) AS zip_with
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')
limit 10;
Resultaat
De resultaten voor deze SQL zouden vergelijkbaar zijn met die hieronder worden weergegeven.
productListItems | zip_with
---------------------+---------
| {(1,NULL), (2,NULL), (3,NULL),(4,NULL), (5,NULL)}
(123679, NULL, NULL) | {(1,123679), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
| {(1,NULL), (2,NULL),(3,NULL),(4,NULL), (5,NULL)}
| {(1,NULL), (2,NULL), (3, NULL),(4,NULL), (5,NULL)}
(1346,NULL, NULL) | {(1,1346), (2,NULL),(3,NULL),(4,NULL), (5,NULL)}
| {(1,NULL), (2,NULL), (3,NULL),(4,NULL), (5,NULL)}
(98347, NULL, NULL) | {(1,98347), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
| {(1,NULL), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
(176015, NULL, NULL) | {(1,176015),(2,NULL), (3,NULL), (4,NULL), (5,NULL)}
| {(1,NULL), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
(10 rows)
Map_from_entries gebruiken om een opeenvolgingsaantal aan elk punt in de productlijst toe te wijzen en het definitieve resultaat als kaart te verkrijgen
map_from_entries(array<struct<K, V>>): map<K, V>
Dit fragment zet een array van sleutelwaardeparen om in een kaart. Het is nuttig wanneer het behandelen van zeer belangrijk-waardepaargegevens die van een meer georganiseerde en efficiënte structuur zouden kunnen profiteren.
Voorbeeld
De volgende vraag leidt tot paren van waarden van een opeenvolging en de productListItems serie, zet deze paren in een kaart gebruikend map_from_entries om, en selecteert dan de originele productListItems kolom samen met de pas gemaakte map_from_entries kolom. Het resultaat wordt gefilterd en beperkt op basis van het opgegeven tijdstempelbereik.
SELECT productListItems, map_from_entries(zip_with(Sequence(1,Size(productListItems)), productListItems, (x,y) -> struct(x, y))) AS map_from_entries
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')
LIMIT 10;
Resultaat
De resultaten voor deze SQL zouden vergelijkbaar zijn met die hieronder worden weergegeven.
productListItems | map_from_entries
---------------------+------------------
(123679, NULL, NULL) | [1 -> "(123679,NULL,NULL)"]
(1346, NULL, NULL) | [1 -> "(1346, NULL, NULL)"]
(98347, NULL, NULL) | [1 -> "(98347, NULL, NULL)"]
(176015, NULL, NULL) | [1 -> "(176015, NULL, NULL)"]
(92763, NULL, NULL) | [1 -> "(92763, NULL, NULL)"]
(48576, NULL, NULL) | [1 -> "(48576, NULL, NULL)"]
(135778, NULL, NULL) | [1 -> "(135778, NULL, NULL)"]
(123679, NULL, NULL) | [1 -> "(123679, NULL, NULL)"]
(98347, NULL, NULL) | [1 -> "(98347, NULL, NULL)"]
(167753, NULL, NULL) | [1 -> "(167753, NULL, NULL)"]
(10 rows)