2016-05-31 3 views
0

У меня есть данные ниже:SQL номер выбора на основе даты

Numbers  Effdate  End_date 
2017937950 10/31/2010 4/8/2014 11:59:59 PM 
2017937950 10/31/2010 6/30/2011 11:59:59 PM 
4054631308 5/9/2008 12/31/2099 
4054631308 5/9/2008 7/14/2009 11:59:59 PM 
7062329778 10/28/2009 12/31/2099 
7062329778 10/28/2009 11/10/2009 11:59:59 PM 

мне нужно выбрать только те номера, которые имеет end_date 12/31/2099, поэтому данные выглядят, как показано ниже данных:

Numbers  Effdate  End_date 
4054631308 5/9/2008 12/31/2099 
4054631308 5/9/2008 7/14/2009 11:59:59 PM 
7062329778 10/28/2009 12/31/2099 
7062329778 10/28/2009 11/10/2009 11:59:59 PM 

Заранее спасибо за помощь.

+2

Пытались ли вы что-нибудь? Похож на 'where number in' или' where exists' будет делать трюк или «INNER join в подзапросе», который возвращает числа тех, у кого есть дата окончания, присоединяется к числу. Я бы подумал, что существует, возможно, лучшая производительность, но depe nds по индексам и volumn данных – xQbert

+0

Я пробовал, и он дает мне только одно число, связанное с 12/31/2099, а не другое число, хотя –

+0

'SELECT ... FROM ... WHERE end_date = yourdatehere' –

ответ

1

Вам выберите соответствующие строки, используя в пункте

select * from my_table 
where numbers in (select distinct numbers from my_table 
        where end_date = to_date('12/31/2099', 'DD/MM/YYYY')); 
+0

Почему вы используете подзапрос? Одиночный оператор 'Select' с' Where' codndition должен быть достаточным! –

+0

Для получения только запрошенных чисел вы должны использовать подзапрос или объединение .. в этом случае подзапрос более простой .. – scaisEdge

+0

@MaciejLos Он хочет вернуть все строки для набора чисел с указанной датой окончания. Не возвращать только строки для этой даты окончания. См. Его пример вывода. – SQLChao

0

спользование существует: быстрый обычно; но позволяет только доступ к данным в одной из таблиц.

Select Numbers, EffDate, End_Date 
from table B 
where exists (Select 1 from table A 
       where A.end_Date = to_date('12/31/2099', 'DD/MM/YYYY') 
       and A.Numbers= B.Numbers) 

Использование объединения: (позволяет получить доступ ко всем столбцам обеих таблиц присоединился

Select Numbers, EffDate, End_Date 
from table B 
INNER JOIN (Select Distinct Numbers from table 
      where end_date = to_date('12/31/2099', 'DD/MM/YYYY')) 
0

Вы можете достичь этого, используя аналитическую функцию:.

with sample_data as (select 2017937950 Numbers, to_date('10/31/2010', 'mm/dd/yyyy') Effdate, to_date('04/08/2015 23:59:59', 'mm/dd/yyyy hh24:mi:ss') End_date from dual union all 
        select 2017937950 Numbers, to_date('10/31/2010', 'mm/dd/yyyy') Effdate, to_date('04/08/2015 23:59:59', 'mm/dd/yyyy hh24:mi:ss') End_date from dual union all 
        select 4054631308 Numbers, to_date('05/09/2008', 'mm/dd/yyyy') Effdate, to_date('12/31/2099 00:00:00', 'mm/dd/yyyy hh24:mi:ss') End_date from dual union all 
        select 4054631308 Numbers, to_date('05/09/2008', 'mm/dd/yyyy') Effdate, to_date('07/14/2009 23:59:59', 'mm/dd/yyyy hh24:mi:ss') End_date from dual union all 
        select 7062329778 Numbers, to_date('10/28/2009', 'mm/dd/yyyy') Effdate, to_date('12/31/2099 00:00:00', 'mm/dd/yyyy hh24:mi:ss') End_date from dual union all 
        select 7062329778 Numbers, to_date('10/28/2009', 'mm/dd/yyyy') Effdate, to_date('11/10/2009 23:59:59', 'mm/dd/yyyy hh24:mi:ss') End_date from dual) 
select numbers, 
     effdate, 
     end_date 
from (select numbers, 
       effdate, 
       end_date, 
       max(end_date) over (partition by numbers) max_end_date 
     from sample_data) 
where max_end_date = to_date('12/31/2099', 'mm/dd/yyyy'); 

    NUMBERS EFFDATE    END_DATE    
---------- --------------------- --------------------- 
4054631308 05/09/2008 00:00:00 12/31/2099 00:00:00 
4054631308 05/09/2008 00:00:00 07/14/2009 23:59:59 
7062329778 10/28/2009 00:00:00 12/31/2099 00:00:00 
7062329778 10/28/2009 00:00:00 11/10/2009 23:59:59 
Смежные вопросы