внутреннее объединение выберите только одну строку из второй таблицы на основе даты - PullRequest
0 голосов
/ 14 октября 2019

У меня есть таблица пользователей. Каждая запись имеет одну или несколько цен по дате в таблице платежей. Я просто покажу запись, что start_date столбец меньше или равен сегодняшнему?

таблица пользователей

╔════╦══════════════╗
║ id ║  name        ║
╠════╬══════════════║
║  1 ║ Jeff         ║
║  2 ║ Geoff        ║
╚════╩══════════════╝

таблица платежей

╔═══════════════════════════════════╗
║ user_id         start_date  price ║
╠═══════════════════════════════════╣
║ 1               2019-10-14  1000  ║
║ 1               2019-10-11  3500  ║
║ 1               2019-10-16  2000  ║
║ 2               2019-10-13  3500  ║
║ 2               2019-10-12  6500  ║
╚═══════════════════════════════════╝

сегодняшняя дата => 2019-10-13

Что я хочу:

╔═══════════════════════════════════╗
║ user_id         start_date  price ║
╠═══════════════════════════════════╣
║ 1               2019-10-11  3500  ║
║ 2               2019-10-13  3500  ║
╚═══════════════════════════════════╝

Ответы [ 2 ]

1 голос
/ 14 октября 2019
where date_column <= sysdate

или, в конечном итоге

where date_column <= trunc(sysdate)

в зависимости от того, задействован ли компонент времени или нет.

[ПРАВИТЬ, после того, как вы включили данные выборки]

Поскольку «сегодня» равно 2019-10-13, то посмотрите, поможет ли это;вам понадобятся строки с # 14 и далее, поскольку у вас уже есть эти таблицы. Кстати, похоже, что USERS не играет никакой роли в желаемом результате.

SQL> with
  2  users (id, name) as
  3    (select 1, 'Jeff' from dual union all
  4     select 2, 'Geoff' from dual
  5    ),
  6  payments (user_id, start_date, price) as
  7    (select 1, date '2019-10-14', 1000 from dual union all
  8     select 1, date '2019-10-11', 3500 from dual union all
  9     select 1, date '2019-10-16', 2000 from dual union all
 10     select 2, date '2019-10-13', 3500 from dual union all
 11     select 2, date '2019-10-12', 6500 from dual
 12    ),
 13  --
 14  temp as
 15    (select p.user_id, p.start_date, p.price,
 16       row_number() over (partition by user_id order by start_date desc) rn
 17     from payments p
 18     where p.start_date <= date '2019-10-13'
 19    )
 20  select user_id, start_date, price
 21  from temp
 22  where rn = 1;

   USER_ID START_DATE      PRICE
---------- ---------- ----------
         1 2019-10-11       3500
         2 2019-10-13       3500

SQL>
0 голосов
/ 14 октября 2019

Один метод использует коррелированный подзапрос:

select p.*
from payments p
where p.date = (select max(p2.start_date)
                from payments p2
                where p2.user_id = p.user_id and
                      p2.start_date <= date '2019-10-13'
               );

Или в Oracle вы можете использовать агрегирование и keep:

select p.user_id, max(p.start_date) as start_date,
       max(p.price) keep (dense_rank first order by p.start_date desc) as price
from payments p
group by p.user_id;

Синтаксис keep (в этом примере) сохраняет первое значение в агрегации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...