web-dev-qa-db-ja.com

influxDBでDistinct関数を使用する方法

私はinflux DBを使用してコマンドを発行していますが、

SELECT * FROM interface

以下は出力です

interface 
time                              element                path                                       value
2016-08-24T21:22:16.7080877Z    "link-layer-address0"   "key:/arp-information/link-layer-address0"  "3c:61:04:48:df:91"
2016-08-24T21:22:17.9090527Z    "link-layer-address0"   "key:/arp-information/link-layer-address0"  "3c:61:04:48:df:92"
2016-08-24T21:22:19.8584133Z    "link-layer-address1"   "key:/arp-information/link-layer-address1"  "3c:61:04:48:df:97"
2016-08-24T21:22:20.3377847Z    "link-layer-address2"   "key:/arp-information/link-layer-address2"  "3c:61:04:48:df:90"

コマンドを発行すると、正常に動作します。

SELECT distinct(value) FROM interface 

しかし、パス列に対してコマンドを発行すると、出力はありません。私は何が欠けているのだろうか?

SELECT distinct(path) FROM interface 
9
Ammad

追加情報@Ammadをありがとう。

簡潔な答え

タグ付きの_GROUP BY_を試してください。 DISTINCT()はフィールドでのみ機能します。

長い答え

distinct()は、タグではなくフィールドで機能します。こちらをご覧ください:

https://docs.influxdata.com/influxdb/v1.0/query_language/functions/#distinct

DISTINCT()は、単一のフィールドの一意の値を返します。

フィールド値は、対象となる実際のデータであることを意図しています。タグ値はメタデータ、つまりデータに関するデータです。データベースシステムのほとんどの機能は、データまたはメタデータで動作しますが、両方で動作することはまれです。

これはv0.13のおもちゃの例で、distinct()がタグで実際に機能しないことを示しています。

_insert foo,tag1=asdf field1="some text"
insert foo,tag1=asdf field1="some text"
insert foo,tag1=asdfg field1="some text"
insert foo,tag1=asdfg field1="some text"
insert foo,tag1=asdfg field1="some more text"
insert foo,tag1=asdfg field1="some more text"
_

今いくつかのクエリ:

_select * from foo

name: foo
time                            field1          tag1
2016-09-12T05:19:53.563221799Z  some text       asdf
2016-09-12T05:20:03.027652248Z  some text       asdf
2016-09-12T05:20:10.04939971Z   some text       asdfg
2016-09-12T05:20:11.235525548Z  some text       asdfg
2016-09-12T05:20:17.418920163Z  some more text  asdfg
2016-09-12T05:20:19.354742922Z  some more text  asdfg
_

では、distinct()を試してみましょう

_select distinct(tag1) from foo
_

結果はまったく出力されません。

_select distinct(field1) from foo

name: foo
time                    distinct
1970-01-01T00:00:00Z    some text
1970-01-01T00:00:00Z    some more text
_

_GROUP BY_を使用すると、必要なものを取得できる場合があります。このような:

_select distinct(field1) from foo group by tag1
_

それは与える:

_name: foo
tags: tag1=asdf
time                    distinct
1970-01-01T00:00:00Z    some text

name: foo
tags: tag1=asdfg
time                    distinct
1970-01-01T00:00:00Z    some text
1970-01-01T00:00:00Z    some more text
_

これは、_tag1_の各値と、その_field1_値に関連付けられている_tag1_の値を示しています。

お役に立てば幸いです。

14
Jason

ダブルSELECTステートメントを使用してこれを解決する方法があります。

> select distinct("tag1") from (select "field1", "tag1" from foo)

内部クエリはfield1とtag1を返します。これは、適用可能な通常のフィールドと同様に外部でクエリできますdistinct()。

それが役に立てば幸い。コスモ。

11
Cosmo

有る SHOW TAG VALUES WITH key = path一意のタグ値を取得するために使用できます

5
Alexander