powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос.
14 сообщений из 14, страница 1 из 1
Помогите написать запрос.
    #39944579
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица «Т» с полями: IDF, DATA, А, Б, В и Г.

IDF – внешний ключ

DATA - текущий день

Поля А, Б и В заносятся в таблицу пользователем каждый день.

Нужно вычислить поле Г по следующему правилу:

если В > 0.3 то Гi = Ai-Bi + Гj (Гj -берется из строки где IDFi = IDFj и DATAi = DATAi -1день, т.е. берется значение поля Г за предыдущий день из записи с совпадающим полем IDF )

если B <= 0.3 то Гi = Ai-Bi

Помогите составить запрос для вычисления и занесения в таблицу поля Г.

П.С.
Если по задачи видно что БД составлена не правильно и какие-то поля нужно разнести по таблицам - пожалуйста укажите пути
решения.
Если нужно указать реальные поля и описать БД - сделаю.

Спасибо.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39944598
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкладывайте CREATE TABLE для таблицы, исходное заполнение с форме INSERT INTO, и конечное состояние в виде форматированной таблицы. С пояснениями, как именно посчитаны значения.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39944703
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно в таблице `fact` и `forecast` вычислять и заполнять поле `nest`.

Это индекс пожарной опасности В.Г. Нестерова, он высчитывается так:

Если apcp (i) (Осадки за текущий день) <= 0.3 (маленькие либо отсутствуют) то
nest (i) = ( tmp(i) - dpt(i) ) * tmp(i) + Nest (j)
(Разность температуры и точки запросы за текущий день, умножить на температуру за ткущий день + этот же показатель nest за предыдущий день. Т.е. если не было осадков показатель начинает накапливаться .)

Если apcp (i) > 0.3 (если прошли осадки) то просто
nest (i) = ( tmp(i) - dpt(i) ) * tmp(i)

Поля tmp(i) dpt(i) apcp (i) и остальные необходимые поля заносятся в базу ежедневно методом LOAD (unidac, компонент uniload), для 50 000 точек, после чего нужно вычислить поле nest.

БД

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Таблица фактических метеоданных о погоде на каждый день.
-- ----------------------------
DROP TABLE IF EXISTS `fact`;
CREATE TABLE `fact` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`id_poligons` int(0) NULL DEFAULT NULL,
`gust` decimal(10, 3) NULL DEFAULT NULL,
`tmp` decimal(10, 3) NULL DEFAULT NULL,
`rh` decimal(10, 3) NULL DEFAULT NULL,
`dpt` decimal(10, 3) NULL DEFAULT NULL,
`vgrd` decimal(10, 3) NULL DEFAULT NULL,
`ugrd` decimal(10, 3) NULL DEFAULT NULL,
`mtmp` decimal(10, 3) NULL DEFAULT NULL,
`apcp` decimal(10, 3) NULL DEFAULT NULL,
`fdata` date NULL DEFAULT NULL,
`nest` decimal(10, 0) NULL DEFAULT NULL,
`apcpkbdi` decimal(10, 3) NULL DEFAULT NULL,
`kbdi` decimal(10, 0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `FK_forecast_polygons_id`(`id_poligons`) USING BTREE,
CONSTRAINT `FK_fact_polygons_id` FOREIGN KEY (`id_poligons`) REFERENCES `polygons` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 194201 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Таблица прогнозных метеоданных на 14 дней. Перезаписывается каждый день, так как строится на фактических данных за текущий день.
-- ----------------------------
DROP TABLE IF EXISTS `forecast`;
CREATE TABLE `forecast` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`id_poligons` int(0) NULL DEFAULT NULL,
`fdata` date NULL DEFAULT NULL,
`frdata` date NULL DEFAULT NULL,
`tmp` decimal(10, 3) NULL DEFAULT NULL,
`tmax` decimal(10, 3) NULL DEFAULT NULL,
`dpt` decimal(10, 3) NULL DEFAULT NULL,
`rh` decimal(10, 3) NULL DEFAULT NULL,
`vgrd` decimal(10, 3) NULL DEFAULT NULL,
`ugrd` decimal(10, 3) NULL DEFAULT NULL,
`gust` decimal(10, 3) NULL DEFAULT NULL,
`apcp` decimal(10, 3) NULL DEFAULT NULL,
`nest` decimal(10, 0) NULL DEFAULT NULL,
`apcpkbdi` decimal(10, 3) NULL DEFAULT NULL,
`kbdi` decimal(10, 0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `FK_forecast_polygons_id`(`id_poligons`) USING BTREE,
CONSTRAINT `FK_forecast_polygons_id` FOREIGN KEY (`id_poligons`) REFERENCES `polygons` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Координаты полигонов на карте, для каждого из которых в таблицах fact и forecast хранятся метеоданные.
-- ----------------------------
DROP TABLE IF EXISTS `polygons`;
CREATE TABLE `polygons` (
`id` int(0) NOT NULL,
`coor_cntr_lon_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_cntr_lat_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_ld_lon_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_ld_lat_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_ru_lon_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_ru_lat_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_lu_lon_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_lu_lat_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_rd_lon_polygons` decimal(10, 7) NULL DEFAULT NULL,
`coor_rd_lat_polygons` decimal(10, 7) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39944704
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39944759
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
исходное заполнение в форме INSERT INTO

А по фотографиям мы не лечим..
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945431
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Данные на 3 дня для 15 точек (полигонов):

Таблица polygons
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (1, 120.5312485, 55.9070105, 120.4999970, 55.8757590, 120.5625000, 55.9382620, 120.4999970, 55.9382620, 120.5625000, 55.8757590);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (2, 120.5312485, 55.9695135, 120.4999970, 55.9382620, 120.5625000, 56.0007650, 120.4999970, 56.0007650, 120.5625000, 55.9382620);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (3, 120.5312485, 56.0320165, 120.4999970, 56.0007650, 120.5625000, 56.0632680, 120.4999970, 56.0632680, 120.5625000, 56.0007650);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (4, 120.5312485, 56.0945195, 120.4999970, 56.0632680, 120.5625000, 56.1257710, 120.4999970, 56.1257710, 120.5625000, 56.0632680);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (5, 120.5312485, 56.1570220, 120.4999970, 56.1257710, 120.5625000, 56.1882730, 120.4999970, 56.1882730, 120.5625000, 56.1257710);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (6, 120.5312485, 56.2195245, 120.4999970, 56.1882730, 120.5625000, 56.2507760, 120.4999970, 56.2507760, 120.5625000, 56.1882730);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (7, 120.5312485, 56.2820275, 120.4999970, 56.2507760, 120.5625000, 56.3132790, 120.4999970, 56.3132790, 120.5625000, 56.2507760);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (8, 120.5312485, 56.3445305, 120.4999970, 56.3132790, 120.5625000, 56.3757820, 120.4999970, 56.3757820, 120.5625000, 56.3132790);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (9, 120.5312485, 56.4070335, 120.4999970, 56.3757820, 120.5625000, 56.4382850, 120.4999970, 56.4382850, 120.5625000, 56.3757820);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (10, 120.5312485, 56.4695365, 120.4999970, 56.4382850, 120.5625000, 56.5007880, 120.4999970, 56.5007880, 120.5625000, 56.4382850);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (11, 120.5312485, 56.5320395, 120.4999970, 56.5007880, 120.5625000, 56.5632910, 120.4999970, 56.5632910, 120.5625000, 56.5007880);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (12, 120.5312485, 56.5945425, 120.4999970, 56.5632910, 120.5625000, 56.6257940, 120.4999970, 56.6257940, 120.5625000, 56.5632910);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (13, 120.5312485, 56.6570450, 120.4999970, 56.6257940, 120.5625000, 56.6882960, 120.4999970, 56.6882960, 120.5625000, 56.6257940);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (14, 120.5312485, 56.7195475, 120.4999970, 56.6882960, 120.5625000, 56.7507990, 120.4999970, 56.7507990, 120.5625000, 56.6882960);
INSERT INTO `polygons`(`id`, `coor_cntr_lon_polygons`, `coor_cntr_lat_polygons`, `coor_ld_lon_polygons`, `coor_ld_lat_polygons`, `coor_ru_lon_polygons`, `coor_ru_lat_polygons`, `coor_lu_lon_polygons`, `coor_lu_lat_polygons`, `coor_rd_lon_polygons`, `coor_rd_lat_polygons`) VALUES (15, 120.5312485, 56.7820505, 120.4999970, 56.7507990, 120.5625000, 56.8133020, 120.4999970, 56.8133020, 120.5625000, 56.7507990);


Таблица fact
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (1, 3.042, -8.915, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (1, -0.634, -6.504, 0.025, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (1, 4.370, -2.830, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (2, 3.042, -8.915, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (2, -0.634, -6.504, 0.025, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (2, 4.370, -2.830, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (3, 3.042, -8.915, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (3, -0.634, -6.504, 0.025, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (3, 4.370, -2.830, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (4, 3.042, -8.915, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (4, -0.634, -6.504, 0.025, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (4, 4.370, -2.830, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (5, 2.286, -7.475, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (5, -3.496, -7.944, 0.049, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (5, 6.494, -0.490, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (6, 2.286, -7.475, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (6, -3.496, -7.944, 0.049, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (6, 6.494, -0.490, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (7, 2.286, -7.475, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (7, -3.496, -7.944, 0.049, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (7, 6.494, -0.490, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (8, 2.286, -7.475, 0.054, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (8, -3.496, -7.944, 0.049, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (8, 6.494, -0.490, 0.010, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (9, 2.088, -11.975, 0.081, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (9, 2.084, -7.944, 0.012, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (9, 10.886, -0.670, 0.000, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (10, 2.088, -11.975, 0.081, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (10, 2.084, -7.944, 0.012, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (10, 10.886, -0.670, 0.000, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (11, 2.088, -11.975, 0.081, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (11, 2.084, -7.944, 0.012, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (11, 10.886, -0.670, 0.000, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (12, 2.088, -11.975, 0.081, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (12, 2.084, -7.944, 0.012, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (12, 10.886, -0.670, 0.000, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (13, 3.924, -5.855, 0.047, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (13, 0.752, -5.784, 0.000, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (13, 4.208, -2.650, 0.002, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (14, 3.924, -5.855, 0.047, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (14, 0.752, -5.784, 0.000, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (14, 4.208, -2.650, 0.002, '2020-03-10');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (15, 3.924, -5.855, 0.047, '2020-03-08');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (15, 0.752, -5.784, 0.000, '2020-03-09');
INSERT INTO `fact`(`id_poligons`, `tmp`, `dpt`, `apcp`, `fdata`) VALUES (15, 4.208, -2.650, 0.002, '2020-03-10');

...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945441
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LДля первой даты (для которой не существует предыдущей) nest (i) = ( tmp(i) - dpt(i) ) * tmp(i)
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945456
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично. Вот fiddle с этими данными.

Данные, правда, дерьмовые - ибо в алгоритме
Zoola
Если apcp (i) (Осадки за текущий день) <= 0.3 (маленькие либо отсутствуют) то

...

Если apcp (i) > 0.3 (если прошли осадки) то

а в данных максимальное это самое apcp равно 0,081...

В общем, давайте так. Берёте fiddle, правите там исходные данные (найдите такие, чтобы первые 2-3 точки были с арср меньше 0,3, а следующие больше, или наоборот - сляпайте руками от балды, в конце концов), выкладываете ссылку на такой fiddle, а также даёте расчёт этого самого nest для этих 5-6 точек "вручную" (можно с пояснением, откуда что берётся). т.е. пусть будет 2-3 полигона - но минимум за неделю. К слову, таблица полигонов сама по себе тут нафиг не нужна.

Дополнительно - укажите ТОЧНО версию MySQL. Это важно.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945562
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=195574ffd753e24259251067e29cc72b

Комментарии



Вообще у меня стоит версия 8.0.19, но если указываю dbfiddle 8ку, почему-то с моей схемой не запускается.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945590
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zoola
если указываю dbfiddle 8ку, почему-то с моей схемой не запускается

Какой-то косяк на сервере. Починят... а мы пока с Машкой поработаем - благо разница невелика, а в этой задаче её и вовсе нет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
WITH cte AS ( SELECT id_poligons,
                     tmp,
                     dpt,
                     apcp,
                     fdata,
                     nest,
                     (tmp-dpt)*tmp as clear_nest
              FROM fact )
SELECT  id_poligons,
         tmp,
         dpt,
         apcp,
         fdata,
         nest,
         clear_nest + (apcp <= 0.3) * COALESCE(LAG(clear_nest) OVER (PARTITION BY id_poligons ORDER BY fdata), 0) calculated_nest
FROM cte
ORDER BY id_poligons, fdata;


fiddle .
Специально выведены рядом посчитанное тобой значение, и получаемое в запросе.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945869
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо.

Если можно еще пара вопросов.

Не могу понять работу вот этой части "PARTITION BY id_poligons ", погулил но не понял. Объясните ?

И как мне теперь заполнить поле nest в свое базе. Нужно "завернуть" этот скрипт в оператор Update ?
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39945883
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zoola
Не могу понять работу вот этой части "PARTITION BY id_poligons ", погулил но не понял. Объясните ?
Читайте вот это: Window Functions , со всеми подразделами, внимательно и вдумчиво.
Код: sql
1.
LAG(clear_nest) OVER (PARTITION BY id_poligons ORDER BY fdata)

переводится так: взять значение поля clear_nest из записи, которая имеет то же значение id_poligons, что и текущая, и идёт перед текущей при сортировке по fdata.

Zoola
как мне теперь заполнить поле nest в свое базе. Нужно "завернуть" этот скрипт в оператор Update ?
Ессессно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
UPDATE fact t1
JOIN ( WITH cte AS 
       ( SELECT id_poligons,
                apcp,
                fdata,
                (tmp-dpt)*tmp as clear_nest
         FROM fact )
       SELECT  id_poligons,
               fdata,
               clear_nest + (apcp <= 0.3) * COALESCE(LAG(clear_nest) OVER (PARTITION BY id_poligons ORDER BY fdata), 0) calculated_nest
       FROM cte
) t2 USING (id_poligons, fdata)
SET t1.nest = t2.calculated_nest;



fiddle (db-fiddle.uk всё ещё крючит...).
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39946001
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Извини, ошибся и предоставил не верный ручной расчет для nest (рукалицо).

В случаи apcp > 0.3 я прибавлял clear_nest из предыдущей строки а нужно предыдущее значение самого поля calculated_nest.

Вот верные расчеты https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=359ad1042a663ea4ad08b9228129f66d

Я попытался нагородить такое :

код
WITH cte AS ( SELECT id_poligons,
tmp,
dpt,
apcp,
fdata,
nest,
null as calculated_nest,
(tmp-dpt)*tmp as clear_nest
FROM fact )
SELECT id_poligons,
tmp,
dpt,
apcp,
fdata,
clear_nest,
nest,
CASE
WHEN apcp <= 0.3 THEN clear_nest + COALESCE(LAG( calculated_nest ) OVER (PARTITION BY id_poligons ORDER BY fdata), 0)
ELSE clear_nest
END as calculated_nest

FROM cte ORDER BY id_poligons, fdata;

Но работает не правильно, потому, что видимо значений calculated_nest не существует до конца выполнения скрипта.
...
Рейтинг: 0 / 0
Помогите написать запрос.
    #39946329
Zoola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, можем продолжить в ветке - работа? Если да, дайте почту.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]