Verwenden Sie Exists , um herauszufinden, ob ein Produkt mit einer bestimmten SKU vorhanden ist.
exists(array<T>, function<T, boolean>): boolean
Im obigen Ausschnitt wird die Funktion exists
auf jedes Element des Arrays angewendet und gibt einen booleschen Wert zurück. Der boolesche Wert gibt an, ob das Array ein oder mehrere Elemente enthält, die eine bestimmte Bedingung erfüllen. In diesem Fall wird bestätigt, ob ein Produkt mit einer bestimmten SKU vorhanden ist.
Beispiel
Im folgenden SQL-Beispiel ruft die Abfrage productListItems
aus der geometrixxx_999_xdm_pqs_1batch_10k_rows
ab und bewertet, ob ein Element mit einer SKU gleich 123679
im productListItems
-Array vorhanden ist. Anschließend werden die Ergebnisse anhand eines bestimmten Zeitstempelbereichs gefiltert und die endgültigen Ergebnisse auf zehn Zeilen begrenzt.
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;
Ergebnis
Die Ergebnisse für diese SQL-Abfrage ähneln denen unten.
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)
Verwenden Sie den Filter, um Produkte zu finden, bei denen die SKU > 100000
filter(array<T>, function<T, boolean>): array<T>
Diese Funktion filtert ein Array von Elementen basierend auf einer bestimmten Bedingung, die jedes Element als booleschen Wert auswertet. Anschließend wird ein neues -Array zurückgegeben, das nur Elemente enthält, bei denen die Bedingung einen Wert „true“ zurückgegeben hat.
Beispiel
Die nachstehende Abfrage wählt die Spalte productListItems
aus, wendet einen Filter an, um nur Elemente mit einer SKU von mehr als 100000 einzuschließen, und beschränkt den Ergebnissatz auf Zeilen innerhalb eines bestimmten Zeitstempelbereichs. Das gefilterte Array wird dann in der Ausgabe als Alias _filter
.
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;
Ergebnis
Die Ergebnisse für diese SQL-Abfrage ähneln denen unten.
productListItems | _filter
-----------------+---------
(123679, NULL, NULL) (123679, NULL, NULL)
(1346, NULL, NULL) |
(98347, NULL, NULL) |
(176015, NULL, NULL) | (176015, NULL, NULL)
(10 rows)
Verwenden Sie Aggregat , um die SKUs aller Produktlistenelemente zu summieren, die mit einer bestimmten ID verknüpft sind, und verdoppeln Sie die resultierende Summe.
aggregate(array<T>, A, function<A, T, A>[, function<A, R>]): R
Dieser Aggregatvorgang wendet einen binären Operator auf einen Anfangszustand und alle Elemente im Array an. Außerdem werden mehrere Werte auf einen einzelnen Status reduziert. Nach dieser Reduktion wird dann der Endzustand mithilfe einer Finish-Funktion in das Endergebnis umgewandelt. Die Finish-Funktion nimmt den letzten Status an, der nach dem Anwenden des binären Operators auf alle Array-Elemente erhalten wurde, und macht etwas mit ihr, um das Endergebnis zu erzeugen.
Beispiel
Dieses Abfragebeispiel berechnet den maximalen SKU-Wert aus dem productListItems
-Array innerhalb des angegebenen Zeitstempelbereichs und verdoppelt das Ergebnis. Die Ausgabe enthält das ursprüngliche productListItems
-Array und die berechnete 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;
Ergebnis
Die Ergebnisse für diese SQL-Abfrage ähneln denen unten.
productListItems | max_value
-----------------+---------
(123679, NULL, NULL) | 247358
(1346,NULL, NULL) | 2692
(98347, NULL, NULL) | 196694
(176015, NULL, NULL) | 352030
(10 rows)
Verwenden Sie zip_with , um allen Elementen in der Produktliste eine Sequenznummer zuzuweisen
zip_with(array<T>, array<U>, function<T, U, R>): array<R>
Dieses Snippet kombiniert die Elemente zweier Arrays zu einem einzigen neuen Array. Der Vorgang wird unabhängig für jedes Element des Arrays ausgeführt und erzeugt Wertpaare. Wenn ein Array kürzer ist, werden Null-Werte hinzugefügt, um die Länge des längeren Arrays zu berücksichtigen. Dies geschieht, bevor die Funktion angewendet wird.
Beispiel
Die folgende Abfrage verwendet die zip_with
-Funktion, um Wertpaare aus zwei Arrays zu erstellen. Dies erfolgt durch Hinzufügen der SKU-Werte aus dem productListItems
-Array zu einer ganzzahligen Sequenz, die mithilfe der Sequence
-Funktion generiert wurde. Das Ergebnis wird neben der ursprünglichen productListItems
-Spalte ausgewählt und ist auf der Grundlage eines Zeitstempelbereichs begrenzt.
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;
Ergebnis
Die Ergebnisse für diese SQL-Abfrage ähneln denen unten.
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)
Verwenden Sie map_from_entries, um jedem Element in der Produktliste eine Sequenznummer zuzuweisen und das Endergebnis als Zuordnung zu erhalten
map_from_entries(array<struct<K, V>>): map<K, V>
Dieses Snippet konvertiert ein Array von Schlüssel-Wert-Paaren in eine Zuordnung. Dies ist nützlich, wenn es um Daten mit Schlüssel-Wert-Paaren geht, die von einer besser organisierten und effizienteren Struktur profitieren könnten.
Beispiel
Die folgende Abfrage erstellt Wertpaare aus einer Sequenz und dem productListItems-Array, wandelt diese Paare mithilfe von map_from_entries in eine Zuordnung um und wählt dann die ursprüngliche productListItems-Spalte zusammen mit der neu erstellten map_from_entries-Spalte aus. Das Ergebnis wird basierend auf dem angegebenen Zeitstempelbereich gefiltert und eingeschränkt.
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;
Ergebnis
Die Ergebnisse für diese SQL-Abfrage ähneln denen unten.
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)