Я хотел бы попросить помочь отобразить некоторую информацию о запросах, сделанных в базе данных. У меня есть таблица под названием membervalues. В этой таблице у меня есть 4 поля => (id, memberid, submit_datetime, value). Я хочу показать максимум и минимум value каждого члена на основе записи id. Например, у меня есть следующие

  id | memberid |    submit_datetime    | value
 ------------------------------------------------
  1  |    1     |  2018-01-18 09:44:00  |   86
  2  |    2     |  2018-01-18 10:32:00  |   95
  3  |    3     |  2018-01-18 11:19:00  |   74
  4  |    1     |  2018-01-18 17:57:00  |   84
  5  |    3     |  2018-01-18 18:31:00  |   96
  7  |    1     |  2018-01-19 06:31:00  |   86
  8  |    2     |  2018-01-19 07:31:00  |   94
  9  |    1     |  2018-01-19 08:31:00  |   87

Какой один запрос вернет следующий результат в цикле php?

  memberid  |  min_record_value | max_record_value
 ------------------------------------------------
  1         |        86         |       87
  2         |        95         |       94
  3         |        74         |       96

Я могу получить минимальный и максимальный id, но через min (id) и max (id) с GROUP BY memberid, но я не могу понять, как получить с ним значение записи, как я требовал выше. Во время поиска я наткнулся на mysql - объединить первую и последнюю записи по группе type? и попытался применить аналогичный подход с

select x2.memberid, x2.value as min_record_value, y2.value as max_record_value
from (select *
  from (select memberid, value
    from membervalues
    order by 1, 2) x1
  group by 1) x2
join (select *
  from (select memberid, value
    from membervalues
    order by 1, 2 desc) y1
  group by 1) y2 on y2.memberid = x2.memberid

Но он возвращает только значения первых строк для обоих, как показано ниже.

  memberid  |  min_record_value | max_record_value
 ------------------------------------------------
  1         |        86         |       86
  2         |        95         |       95
  3         |        74         |       74

Любая помощь будет оценена. Благодарность

-1
user15179042 10 Фев 2021 в 02:38

1 ответ

Лучший ответ

Вы можете использовать оконную функцию row_number(), чтобы назначить номер, начиная с 1, каждой записи для каждого memberid в зависимости от позиции записи при упорядочении по submit_datetime и id (для разрешения возможных ничей). Один раз в порядке возрастания для минимума и один раз в порядке убывания для максимума. Затем вы можете присоединиться к производной таблице для общего memeberid и этого числа и отфильтровать это число, являющееся 1.

SELECT xmi.memberid,
       xmi.value min_record_value,
       xma.value max_record_value
       FROM (SELECT v1.memberid,
                    v1.value,
                    row_number() OVER (PARTITION BY v1.memberid
                                       ORDER BY v1.submit_datetime ASC,
                                                v1.id ASC) rn
                    FROM membervalues v1) xmi
            INNER JOIN (SELECT v2.memberid,
                               v2.value,
                               row_number() OVER (PARTITION BY v2.memberid
                                                  ORDER BY v2.submit_datetime DESC,
                                                           v2.id DESC) rn
                               FROM membervalues v2) xma
                       ON xma.memberid = xmi.memberid
                          AND xma.rn = xmi.rn
       WHERE xma.rn = 1
             AND xmi.rn = 1;
1
sticky bit 10 Фев 2021 в 00:31