powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как реализовать запрос? Стоит ли менять структуру базы?
4 сообщений из 4, страница 1 из 1
Как реализовать запрос? Стоит ли менять структуру базы?
    #38955331
bndrnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Очень надеюсь на вашу помощь!

В настоящее время проектирую базу данных метеоролигеских измерений. Сейчас в базе содержится 16 таблиц, соответствующих 8 различным метео-показателям. Табл. 1 - макс температура в течение дня, табл 2. - мин температура в течение дня, табл. 3 - макс давление в течение дня, табл 4. - мин давление в течение дня и так далее. В каждой таблице записаны данные для всех метеостанций на все дни года (местами данные неплолные, т.е. с какой-то станции в какой-то день замера нет). То есть получается ID станции в каждой таблице далеко не уникален. Станций чуть более 5000.

Пример таблицы (дневной максимум температуры):
ID станции | месяц-день | значение показателя
1001 01-01 -17
1001 01-02 -19
1001 01-03 -18
... ... ...
1001 12-31 -15
1002 01-01 23
1002 01-02 25
... ... ...

Теперь о том, что хотелось бы с этими данными делать.
Задаются, например, пределы температуры (от -5 до 10) и пределы давления (от 750 до 770), а также временной промежуток (с 01-30 по 02-15). Хотелось бы выбрать ID станций, которые на протяжении всего указанного временного промежутка удовлетворяют заданным условиям. (Если данных на какой-то день нет, логично считать, что станция условиям не удовлетворяет).

Скажите, пожалуйста, возможно ли вообще реализовать такой запрос? Если нет, как изменить структуру базы, чтобы это стало возможным?

Заранее благодарен за помощь!
...
Рейтинг: 0 / 0
Как реализовать запрос? Стоит ли менять структуру базы?
    #38955339
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bndrnkЗдравствуйте! Очень надеюсь на вашу помощь!

В настоящее время проектирую базу данных метеоролигеских измерений. Сейчас в базе содержится 16 таблиц, соответствующих 8 различным метео-показателям. Табл. 1 - макс температура в течение дня, табл 2. - мин температура в течение дня, табл. 3 - макс давление в течение дня, табл 4. - мин давление в течение дня и так далее. В каждой таблице записаны данные для всех метеостанций на все дни года (местами данные неплолные, т.е. с какой-то станции в какой-то день замера нет). То есть получается ID станции в каждой таблице далеко не уникален. Станций чуть более 5000.

Пример таблицы (дневной максимум температуры):
ID станции | месяц-день | значение показателя
1001 01-01 -17
1001 01-02 -19
1001 01-03 -18
... ... ...
1001 12-31 -15
1002 01-01 23
1002 01-02 25
... ... ...

Теперь о том, что хотелось бы с этими данными делать.
Задаются, например, пределы температуры (от -5 до 10) и пределы давления (от 750 до 770), а также временной промежуток (с 01-30 по 02-15). Хотелось бы выбрать ID станций, которые на протяжении всего указанного временного промежутка удовлетворяют заданным условиям. (Если данных на какой-то день нет, логично считать, что станция условиям не удовлетворяет).

Скажите, пожалуйста, возможно ли вообще реализовать такой запрос? Если нет, как изменить структуру базы, чтобы это стало возможным?

Заранее благодарен за помощь!


1. запрос возможен при сушествуюшей структуре

логически, такой запрос можно решить несколькими способами, например:
из списка все станций вычесть станции которые НЕ удовлетворяют условиям:
(предпологается наличие НУЛЛ записи при отсутствии показаний.
Если запись просто отсутствует, надо еше иметь таблицу дат.
Или менять приведеную "негативную" логику на более сложную "позитивную")

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select 
  *
from 
  all_station_list asl
LEFT JOIN
(
select distinct station_id
from max_temp mt
where 
  ddate between '2015-01-30' по '2015-02-15'
  and NOT (max_t between -5 and 3)

UNION ALL

select distinct station_id
from pressure p 
where 
  ddate between '2015-01-30' по '2015-02-15'
  and NOT (preddure_value between 720 and 750)

) z

ON z.station_id = asl.station_id
WHERE  z.station_id is NULL



2. существует как минимум еше два способа хранения подобной информации:

2.1. прочитайте про EAV
2.2 самое лучшее при наличии стабильного недлинного списка
показаний -- единая таблица:

id, record_date, station_id, max_temperature, min_temperature, average_pressure, ......measurement11, measurement12

запрос будет быстрее и удобнее.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select station_id
from new_table
where
  record_date between date1 and date2
group by 
  station_id
having
  count(recotd_date) = sum(max_temperature between -5 and 2)
  and
  count(recotd_date) = sum(air_pressure between 720 and 750)



вариации на тему с хорошими шансами работы по индексам:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select station_id
from new_table
where
  record_date between date1 and date2
  аnd
  max_temperature between -5 and 2
  and
  air_pressure between 720 and 750 
  
group by 
  station_id
having
  count(1) = datediff(date1,date2)
...
Рейтинг: 0 / 0
Как реализовать запрос? Стоит ли менять структуру базы?
    #38955437
bndrnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc, спасибо большое за содержательный ответ!
...
Рейтинг: 0 / 0
Как реализовать запрос? Стоит ли менять структуру базы?
    #38956956
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc2.2 самое лучшее при наличии стабильного недлинного списка
показаний -- единая таблица:
id, record_date, station_id, max_temperature, min_temperature, average_pressure, ......measurement11, measurement12
запрос будет быстрее и удобнее.


Несомненно это самый удобный способ.
+ самый компактный.
Только с Null не запутаться.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как реализовать запрос? Стоит ли менять структуру базы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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