SQL-запрос для получения почасовых данных для максимального номера версии в день

У меня есть две связанные таблицы, как показано ниже.

Главный стол:

ИДЕНТИФИКАТОР Дата Преподобный 1 01.01.2022 1 2 2022-01-02 1 3 2022-01-02 2 4 03.01.2022 1

Подробная таблица:

ИДЕНТИФИКАТОР час Емкость 1 1 1 1 2 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 1 9 3 2 10 3 3 11 3 4 12 4 1 13 4 2 14 4 3 15 4 4 16

Емкость на каждый день будет сохранена несколько раз как редакция. В какой-то день будет 1 ревизия, в какой-то день 3, в зависимости от количества сохраненных данных.

Теперь мне нужно взять данные из этих двух таблиц в одном запросе с наибольшей редакцией за каждый день. Ожидается 12 строк данных за 3 существующих дня в выбранном месяце.

Я написал запрос ниже

select a1.wdcm_date as wdcm_date, c1.wdcd_block_no as wdcd_block_no, c1.wdcd_capacity as wdcd_capacity, 
      c1.wdcd_approval as wdcd_approval, a1.wdcm_revision_no as wdcm_revision_no
from wb_declared_capacity_master a1, wb_declared_capacity_detail c1
where a1.wdcm_internal_id = c1.wdcd_ref_id  and to_char(a1.wdcm_date,'MM yyyy')='01 2022' 
and wdcm_revision_no = (select max(wdcm_revision_no) from wb_declared_capacity_master where to_char(wdcm_date,'MM yyyy')='01 2022')

Это возвращает только данные с датами версии 3.

Мой ожидаемый результат должен быть

Дата час Емкость Преподобный 01.01.2022 1 1 1 01.01.2022 2 2 1 01.01.2022 3 3 1 01.01.2022 4 4 1 2022-01-02 1 9 2 2022-01-02 2 10 2 2022-01-02 3 11 2 2022-01-02 4 12 2 03.01.2022 1 13 1 03.01.2022 2 14 1 03.01.2022 3 15 1 03.01.2022 4 16 1

Как получить все 12 строк (все часы для каждой соответствующей версии)?

Почему имена столбцов в вашем запросе не совпадают с именами столбцов в ваших таблицах?

MatBailie 19.07.2024 13:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш подзапрос возвращает только один номер редакции, а не разные номера для каждой даты.

Вам нужен «коррелированный» подзапрос, где подзапрос ссылается на исходное значение во внешнем запросе...

Кроме того, действительно не используйте , для соединений, которые с 1992 года заменены синтаксисом ANSI!

Наконец, не используйте бессмысленные псевдонимы, такие как a1, c1 и т. д. Это усложняет чтение кода, а не облегчает его. Псевдонимы должны иметь смысл.

SELECT
   cm.wdcm_date as wdcm_date,
   cd.wdcd_block_no as wdcd_block_no,
   cd.wdcd_capacity as wdcd_capacity, 
   cd.wdcd_approval as wdcd_approval,
   cm.wdcm_revision_no as wdcm_revision_no
FROM
   wb_declared_capacity_master   AS cm
INNER JOIN
   wb_declared_capacity_detail   AS cd
      ON cd.wdcd_ref_id = cm.wdcm_internal_id 
WHERE
   to_char(cm.wdcm_date,'MM yyyy')='01 2022' 
   AND
   cm.wdcm_revision_no = (
      SELECT MAX(wdcm_revision_no)
        FROM wb_declared_capacity_master
       WHERE wdcm_date = cm.wdcm_date
   ) 

Еще один случай, который проще и быстрее с DISTINCT ON:

SELECT m.date, d.hour, d.capacity, m.rev
FROM  (
   SELECT DISTINCT ON (date)    -- simple & fast
          id, date, rev
   FROM   master
   WHERE  date >= '2022-01-01'  -- ! sargable = faster
   AND    date <  '2022-01-02'  -- !
   ORDER  BY date, rev DESC
   ) m
LEFT   JOIN detail d USING (id)
ORDER  BY date, hour;

Видеть:

И избегайте выражений в столбцах перед фильтрацией, как чумой.
to_char(date,'MM yyyy') = '01 2022') стоит очень дорого. Прежде чем применить фильтр, его необходимо вычислить для каждой строки таблицы. Используйте фильтр «sargable». Гораздо быстрее, особенно с применимым индексом, но и без него. Связанный:

Тонкие детали: я использую LEFT JOIN, чтобы сохранить в результате каждый квалификационный день, даже если детали отсутствуют. Это может быть возможно или невозможно с вашей моделью данных. Но в любом случае не повредит.

Другие вопросы по теме