Ранее мы широко использовали оператор group by для выполнения сложных запросов агрегации.
В этом уроке мы рассмотрим операторы «into» и «order by» close.
Помимо вставки или выбора данных, мы также можем сохранить результаты одного запроса в другой таблице. Использование чего-то подобного может варьироваться. Например, у вас может быть сложная операция, которая не может быть выполнена в одном запросе.
Прежде чем мы продолжим, убедитесь, что у вас запущен и работает экземпляр infxdb.
Наиболее распространенным действием в запросе на заполнение будет заполнение измерения результатами предыдущего запроса.
Давайте скопируем базу данных.
1
2
3
4
|
Query query = select() .into( "\"copy_NOAA_water_database\".\"autogen\".:MEASUREMENT" ) .from(DATABASE, "\"NOAA_water_database\".\"autogen\"./.*/" ) .groupBy( new RawText( "*" )); |
Результатом этого запроса будет копирование результатов в измерение h2o_feet_copy_1.
1
|
SELECT * INTO "copy_NOAA_water_database" . "autogen" .:MEASUREMENT FROM "NOAA_water_database" . "autogen" ./.*/ GROUP BY *; |
Теперь давайте просто скопируем столбец в другую таблицу.
1
2
3
4
|
Query query = select().column( "water_level" ) .into( "h2o_feet_copy_1" ) .from(DATABASE, "h2o_feet" ) .where(eq( "location" , "coyote_creek" )); |
Ниже приведен запрос, который будет выполнен.
1
|
SELECT water_level INTO h2o_feet_copy_1 FROM h2o_feet WHERE location = 'coyote_creek' ; |
Также мы можем сделать то же самое с агрегатами.
01
02
03
04
05
06
07
08
09
10
|
Query query = select() .mean( "water_level" ) .into( "all_my_averages" ) .from(DATABASE, "h2o_feet" ) .where(eq( "location" , "coyote_creek" )) .and(gte( "time" , "2015-08-18T00:00:00Z" )) .and(lte( "time" , "2015-08-18T00:30:00Z" )) .groupBy(time(12l,MINUTE)); LOGGER.info( "Executing query " +query.getCommand()); QueryResult queryResult = influxDB.query(query); |
И сгенерируйте запрос, который сохранит результат агрегации в таблицу.
1
|
SELECT MEAN(water_level) INTO all_my_averages FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time (12m); |
Условия заказа
Influxdb обеспечивает порядок, однако он ограничен только датами.
Поэтому мы выполним запрос в порядке возрастания.
1
2
3
|
Query query = select().from(DATABASE, "h2o_feet" ) .where(eq( "location" , "santa_monica" )) .orderBy(asc()); |
И мы получаем восходящий порядок, как и ожидалось.
1
|
SELECT * FROM h2o_feet WHERE location = 'santa_monica' ORDER BY time ASC; |
И тот же запрос мы выполним в порядке убывания.
1
2
3
|
Query query = select().from(DATABASE, "h2o_feet" ) .where(eq( "location" , "santa_monica" )) .orderBy(desc()); |
1
|
SELECT * FROM h2o_feet WHERE location = 'santa_monica' ORDER BY time DESC; |
Это оно! Мы только что создали несколько новых баз данных и измерений, просто используя существующие данные в нашей базе данных. Мы также выполнили несколько заявлений, в которых мы указали время заказа.
Вы можете найти исходный код в github .
Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Руководство по InfluxDBMapper и QueryBuilder для Java. Часть: Into and Order Мнения, высказанные участниками Java Code Geeks, являются их собственными. |