2013-08-10 1 views
1

Пожалуйста, помогите мне составить инструкцию SELECT. У меня есть эти две таблицы:Как написать инструкцию select для этого варианта использования?

Table1     Table2 
----------------  ------------------------------------------------ 
ID | PName |  | ID | NameID | DateActive | HoursActive | 
----------------  ------------------------------------------------ 
1 | Neil |  | 1 | 1 | 8/2/2013 |  3  | 
2 | Mark |  | 2 | 1 | 8/3/2013 |  4  | 
3 | Onin |  | 3 | 2 | 8/2/2013 |  2  | 
----------------  | 4 | 2 | 8/6/2013 |  5  | 
         | 5 | 3 | 8/7/2013 |  1  | 
         | 6 | 3 | 8/8/2013 |  10  | 
         ------------------------------------------------ 

И я просто хочу, чтобы получить ранний DateActive, но не дублировать PNAME. Например:

PName | DateActive | HoursActive | 
---------------------------------------- 
Neil  | 8/2/2013 |  3  | 
Mark  | 8/2/2013 |  2  | 
Onin  | 8/7/2013 |  1  | 
---------------------------------------- 
+2

Пожалуйста [редактировать ] ваш вопрос, чтобы показать, что вы пробовали самостоятельно, чтобы решить проблему. Мы стараемся быть полезными здесь, в StackOverflow, но мы не являемся сервисом написания кода. Сначала мы ожидаем некоторых усилий с вашей стороны. Вопросы, требующие кода, должны по крайней мере показать, что вы понимаете проблему и пытаетесь ее решить, и хотя очень приятно, что вы предоставили образцы данных и вывод, который вы хотите, вы не показали попытку на самом деле написать спросите себя. –

+2

Какие РСУБД - есть общие решения, но есть и специфичные для СУБД ... – sgeddes

ответ

0

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

SELECT 
     PName, MaxDate as DataActive, HoursActive 
From 
     Table1 t1 
    inner Join Table2 t2 on t1.ID = t2.NameID 
    Inner Join (Select min(DateActive) as mindate, NameID from Table2 Group by NameID) as t3 on t3.mindate = t2.ActiveDate and t3.NameID = t2.NameId 
0

Это должно быть довольно стандартное решение:

select t.pname, 
    t2.dateactive, 
    t2.hoursac 
from table1 t 
    join table2 t2 on t.id = t2.nameid 
    join (
     select nameid, min(dateactive) mindateactive 
     from table2 
     group by nameid 
    ) t3 on t2.nameid = t3.name 
      and t3.mindateactive = t2.dateactive 

Если вы используете СУБД, которая поддерживает разбиение на заявления, то это было бы более эффективным:

select pname, dateactive, HoursActive 
from (
    select t.pname, 
     t2.dateactive, 
     t2.hoursactive, 
     rank() over (partition by t.id order by t2.dateactive) rownum 
    from table1 t 
     join table2 t2 on t.id = t2.nameid 
) t 
where rownum = 1 

 Смежные вопросы

  • Нет связанных вопросов^_^