Использование функции агрегирования для фильтрации записи на основе отметки времени MIN - PullRequest
0 голосов
/ 22 мая 2018
SELECT * FROM ABC_CUSTOMER_DETAILS abc_detail
INNER JOIN ABC_CUSTOMERS abc_cust
ON abc_detail.ID=abc_cust.CUSTOMER_ID
WHERE abc_detail.COUNTRY_CODE='KE'
AND CREATION_TIMESTAMP=(SELECT MIN (CREATION_TIMESTAMP)
                        FROM ABC_CUSTOMER_DETAILS abc_detail
                        INNER JOIN ABC_CUSTOMERS abc_cust
                        ON abc_detail.ID=abc_cust.CUSTOMER_ID
                        WHERE abc_detail.COUNTRY_CODE='KE');

Выше записи сценария запроса присоединения от ABC_CUSTOMER_DETAILS до ABC_CUSTOMERS и выберите thw одну с самой ранней отметкой времени.

В любом случае, если я не смогу повторить одно и то же предложение JOIN и WHERE в условии CREATION_TIMESTAMP?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Есть несколько способов получить самую раннюю запись и избежать необходимости вводить одни и те же критерии дважды.

Использование FETCH FIRST ROWS (доступно для Oracle 12c)

select * 
from abc_customer_details cd
join abc_customers c on c.id = cd.customer_id
where cd.country_code = 'KE'
order by creation_timestamp
fetch first row only;

Использование CTE (предложение WITH)

with cte as
(
  select * 
  from abc_customer_details cd
  join abc_customers c on c.id = cd.customer_id
  where cd.country_code = 'KE'
)
select *
from cte
where (creation_timestamp) = (select min(creation_timestamp) from cte);

Использование оконных функций

select *
from
(
  select cd.*, c.*, min(creation_timestamp) over () as min_creation_timestamp
  from abc_customer_details cd
  join abc_customers c on c.id = cd.customer_id
  where cd.country_code = 'KE'
)
where creation_timestamp = min_creation_timestamp;

(я изменил соединениекстати, критерии во всех этих запросах. Просто кажется крайне маловероятным, что вы захотите присоединиться к abc_customer_details.id = abc_customers.customer_id.)

0 голосов
/ 22 мая 2018

Вы можете использовать аналитическую функцию MIN().

SELECT
    *
FROM
    (
        SELECT
            abc_detail.*,
            abc_cust.*,
            MIN(creation_timestamp) OVER(
                PARTITION BY abc_detail.id
            ) AS min_timestamp
        FROM
            abc_customer_details abc_detail
            INNER JOIN abc_customers abc_cust
        ON abc_detail.id = abc_cust.customer_id
        WHERE
            abc_detail.country_code = 'KE'
    )
WHERE
    creation_timestamp = min_timestamp;
...