3 votes

Power M Query/Kusto prendre le premier du groupe

Je dispose d'une table qui ressemble à ceci :

id  timestamp  value1  value2
 1  09:12:37     1       1
 1  09:12:42     1       2
 1  09:12:41     1       3
 1  10:52:16     2       4
 1  10:52:18     2       5
 2  09:33:12     3       1
 2  09:33:15     3       2
 2  09:33:13     3       3

Je dois regrouper par id et value1. Pour chaque groupe, je veux avoir la ligne avec le timestamp le plus élevé.

Le résultat pour la table ci-dessus ressemblerait à ceci :

id  timestamp  value1  value2
 1  09:12:42     1       2
 2  09:33:15     3       2

Je sais qu'il y a l'opérateur summarize qui me donnerait ceci :

mytable
| project id, timestamp, value1, value2
| summarize max(timestamp) by id, value1

Résultat :
     id  timestamp  value1
      1  09:12:42     1
      2  09:33:15     3

Mais je n'ai pas réussi à obtenir value2 pour ces lignes aussi.

Merci d'avance

9voto

Yoni L Points 1487

Si je comprends bien votre question, vous devriez pouvoir utiliser summarize arg_max():

doc: https://docs.microsoft.com/en-us/azure/kusto/query/arg-max-aggfunction

datatable(id:long, timestamp:datetime, value1:long, value2:long)
[
 1, datetime(2019-03-20 09:12:37), 1, 1,
 1, datetime(2019-03-20 09:12:42), 1, 2,
 1, datetime(2019-03-20 09:12:41), 1, 3,
 1, datetime(2019-03-20 10:52:16), 2, 4,
 1, datetime(2019-03-20 10:52:18), 2, 5, // ceci a le dernier horodatage pour id == 1
 2, datetime(2019-03-20 09:33:12), 3, 1,
 2, datetime(2019-03-20 09:33:15), 3, 2, // ceci a le dernier horodatage pour id == 2
 2, datetime(2019-03-20 09:33:13), 3, 3,
]
| summarize arg_max(timestamp, *) by id

Cela donnera le résultat suivant:

| id | timestamp                   | value1 | value2 |
|----|-----------------------------|--------|--------|
| 2  | 2019-03-20 09:33:15.0000000 | 3      | 2      |
| 1  | 2019-03-20 10:52:18.0000000 | 2      | 5      |

-1voto

ooorndtski Points 418

J'ai trouvé une solution à mon problème, mais il pourrait y en avoir une meilleure.

mytable
| project id, timestamp, value1, value2
| order by timestamp desc
| summarize max(timestamp), makelist(value2) by id, value1

Résultats :

 id  timestamp  value1  list_value2
  1  09:12:42     1     ["2", "3", "1"]
  2  09:33:15     3     ["2", "3", "1"]

Maintenant, vous pouvez étendre la requête en ajoutant

| project max_timestamp, id, value1, list_value2[0]

pour obtenir le premier élément de cette liste. Remplacez '0' par un nombre entre 0 et la longueur de list_value2 - 1 pour accéder aux autres valeurs.

Un dernier conseil : Le timestamp que j'utilise est celui généré par ApplicationInsights. Dans notre code, nous appelons TrackTrace pour enregistrer des données. Si vous ordonnez les lignes par ce timestamp, la liste résultante de lignes n'est pas garantie d'être dans le même ordre que les données ont été produites dans le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X