@still_45

Как выбрать последнее по дате значение по группе строк?

Есть таблица: id клиента, дата начала месяца, дата середина месяца, баланс начала месяца, баланс середина месяца.
id не уникальны, те 1 клиент встречается несколько раз.

id, balance_date_start, balance_start, balance_date_mid, balance_mid


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

Писал так:

select distinct id, BALANCE_DATE_start, BALANCE_start, BALANCE_DATE_mid, BALANCE_DATE_mid  from table
where BALANCE_DATE_start in (
select max (BALANCE_DATE_start) from table)
group by ID

Однако, если есть записи с одинаковой датой начала в табл выдает ошибочные записи, не являющиеся последними для клиента.

61a641a891d93390116040.png

пример базы такой, даты это те даты в которых происходит чекин, но каждый клиент чекается только 2 раза в мес, те 2 записей с одними и теми же id и BALANCE_DATE_start быть не может

id            BALANCE_DATE_start   BALANCE_start BALANCE_DATE_mid   BALANCE_DATE_mid
676         2021-10-02            255               2021-10-17                 255
155         2021-10-02            222               2021-10-15                 197
676         2021-09-01            211               2021-09-14                 333    
155         2021-11-01            159               2021-11-15                 104

таблица продолжается дальше и в ней несколько миллионов значений, кусочек для примера

Каким должен быть запрос, чтобы например в этой таблице вывести только строки для каждого уникального ид последней датой ?
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
см. ROW_NUMBER

SELECT
    id,
    balance_date_start,
    balance_start,
    balance_date_mid,
    balance_mid
  FROM (
    SELECT
        cb.*,
        row_number() OVER (PARTITION BY id ORDER BY balance_date_start DESC) r
      FROM client_balance cb
    ) t
  WHERE r = 1
;


см. пример на db<>fiddle
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@alexanderzanin
Может так подойдет?

CREATE TABLE client_balance
(
    id SMALLINT AUTO_INCREMENT,
    id_client INTEGER,
    balance_date_start DATETIME,
    balance_start INTEGER,
    balance_date_mid DATETIME,
    balance_mid INTEGER,
    PRIMARY KEY (id)
);

SELECT cb.*,
       DATEDIFF(cb.balance_date_mid, cb.balance_date_start) AS diff
FROM client_balance AS cb
GROUP BY cb.id_client
HAVING MAX(diff);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы