Выберите последний набор записей в группе SQL - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть база данных Orable с таблицей, подобной следующей:

ID  PROVIDER_ID FROM_CURRENCY   TO_CURRENCY         DATE    AMOUNT  ACTIVE  
1             1           USD           EUR    06-FEB-19      1.23     1
2             2           USD           EUR    06-FEB-19       1.5     1
3             1           GBP           EUR    06-FEB-19      1.23     1
4             1           CAD           EUR    06-FEB-19      1.23     1
5             1           USD           EUR    05-FEB-19       0.7     1
6             1           GBP           EUR    05-FEB-19       0.7     1

Как вы можете видеть, мы храним обменные курсы разных поставщиков с указанием даты, и мне нужно получить идентификаторыпоследние доступные тарифы для определенных to_currency (например, EUR) и provider_id (например, 1) на определенную дату.Поэтому я должен получить что-то вроде следующего:

ID
1
3
4

Обратите внимание, что DATE не является уникальным, поэтому значения могут дублироваться в разных строках, и я не могу использовать его для соединения с подзапросом.Кроме того, учтите, что DATE и ID не связаны, поэтому более высокие даты не обязательно означают более высокие идентификаторы (я не могу просто использовать MAX(ID) в предложении select для получения идентификатора целевой строки).

Iпробовал с помощью следующего запроса, но я получаю ошибку ORA-00979: not a GROUP BY expression

SELECT ID 
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY
HAVING DATE = MAX(DATE)

Я также пробовал следующий запрос с той же ошибкой:

SELECT ID, MAX(DATE)
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY

Запрос, который получаетмне нужны следующие строки, но я не знаю, как получить поле идентификатора для этих строк, поскольку идентификатор не является частью предложения group by.

SELECT MAX(DATE)
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY

Любая идея о том, как можно достичьчто мне нужно?

РЕДАКТИРОВАТЬ Я думаю, что нашел решение

SELECT ID
FROM EXCHANGE_RATE E JOIN
  (SELECT PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY, MAX(DATE) AS LATEST
    FROM EXCHANGE_RATE
    WHERE DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
    GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY) LATEST_EX
  ON E.PROVIDER_ID = LATEST_EX.PROVIDER_ID
  AND E.TO_CURRENCY = LATEST_EX.TO_CURRENCY
  AND E.FROM_CURRENCY = LATEST_EX.FROM_CURRENCY
  AND E.DATE = LATEST_EX.LATEST
WHERE E.ACTIVE = 1 AND E.PROVIDER_ID = 1 AND E.TO_CURRENCY = 'EUR'

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать подзапрос

SELECT ID
  FROM EXCHANGE_RATE
WHERE ("DATE") IN
(
SELECT MAX("DATE")
  FROM EXCHANGE_RATE
 WHERE ACTIVE = 1 
   AND PROVIDER_ID = 1 
   AND TO_CURRENCY = 'EUR' 
 )
   AND ACTIVE = 1 
   AND PROVIDER_ID = 1 
   AND TO_CURRENCY = 'EUR' 

Демо

0 голосов
/ 07 февраля 2019

пользователь row_number() функция ранжирования дат в порядке убывания для каждой валюты

SELECT id
FROM
  (SELECT id, provider_id, from_Currency,
          row_number() over 
          ( partition by from_Currency order by "DATE" desc ) as rn
     FROM EXCHANGE_RATE
  )
WHERE rn=1
0 голосов
/ 07 февраля 2019

Самый простой способ написать хранимый процесс для хранения строки данных, возвращенной последним запросом, и получить идентификатор, выбирая указатель для этого в таблице.

SELECT MAX(DATE)
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY

Кроме этого, единственный способ получить возврат идентификатора из одного запроса - использовать его в группе, но я не вижу, что это решит цель, подзапрос не будет работать так же хорошо, как упоминалосьтобой.

Надеюсь, это поможет:)

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