2010-11-12 4 views
0

У меня есть запрос, где In Мне нужно выбрать все отдельные идентификаторы из таблицы, также нужно выбрать только min (date), чтобы я получал записи, которые были вставлены 1-го, а не ID для все даты.Выберите Distinct Records for min date

В основном это то, что я ищу -

Таблица 1 || Таблица 2-
ID || ID Дата

1 || 1 11/11/2010
1 || 1 10/11/2010
3 || 3 12/01/2010
4 || 4 01/01/2010
4 || 4 02/01/2010

Поэтому мне нужно, чтобы получить все записи из таблицы 2 (table1.ID = table2.ID), который имеет минимальную Дата наряду с этим ID

Результат здесь будет
1 10/11/2010
3 12/01/2010
4 01/01/2010

Вот мой запрос

select u.firstName,u.lastName ,count(*) as theCount 
from tbl_appts_change_log c,tbl_appts a, tbl_users u 
where c.appt_id=a.ID 
and c.user_id=u.userID 
and c.appt_id in (select c.appt_id,min(c.date) from tbl_appts_change_log c, tbl_appts a 
         where c.appt_id=a.ID 
         and a.satellite_id='160' GROUP BY c.appt_id)  
group by u.firstName,u.lastName 
order by count(*) desc,u.firstName,u.lastName 
+0

Каков ваш вопрос? –

+0

Не могли бы вы разместить свою схему? Я не понимаю, что вы пытаетесь сделать с этим запросом .... –

+0

Мне не удалось использовать функцию агрегата и второй столбец для подзапроса. Он приводил всевозможные ошибки .... – san4u28

ответ

0
SELECT u.firstName, 
    u.lastName , 
    COUNT(*) AS theCount 
FROM tbl_appts_change_log c, 
    tbl_appts a, 
    tbl_users u 
WHERE c.appt_id=a.ID 
AND c.user_id =u.userID 
AND a.satellite_id = '160' 
AND c.date = (SELECT MIN(ci.date) 
    FROM tbl_appts_change_log ci, 
    tbl_appts ai 
    WHERE ci.appt_id = ai.ID 
    AND ci.appt_id = c.appt_id 
    AND ai.satellite_id= a.satellite_id 
) 
GROUP BY u.firstName, 
    u.lastName 
ORDER BY COUNT(*) DESC, 
    u.firstName, 
    u.lastName 
0
select u.firstName,u.lastName,count(*) as theCount,cm.MinDate 
from ( 
    select c.appt_id,min(c.date) as MinDate 
    from tbl_appts_change_log c, tbl_appts a 
    where c.appt_id=a.ID 
     and a.satellite_id='160' 
    GROUP BY c.appt_id 
    ) cm 
inner join tbl_appts_change_log c on cm.appt_id = c.appt_id and cm.MinDate = c.date 
inner join tbl_appts a on c.appt_id=a.ID 
inner join tbl_users u on c.user_id=u.userID 
group by u.firstName,u.lastName 
order by count(*) desc,u.firstName,u.lastName 
-1

Это то, что вам нужно?

select u.firstName,u.lastName ,count(*) as theCount 
from tbl_appts_change_log c,tbl_appts a, tbl_users u 
where c.appt_id=a.ID 
and c.user_id=u.userID 
and a.satellite_id = '160' 
and c.date = (
    select min(date) 
    from tbl_appts_change_log c, tbl_appts a 
    where c.appt_id = a.id 
    and a.satellite_id = '160' 
) 
group by u.firstName,u.lastName 
order by count(*) desc,u.firstName,u.lastName 
+0

Мне нужно выбрать ID для даты min – san4u28

1

может быть:

select u.firstName,u.lastName ,count(*) as theCount 
from tbl_appts_change_log c 
INNER JOIN tbl_appts a on c.appt_id=a.ID 
INNER JOIN tbl_users u on c.user_id=u.userID 
INNER JOIN (select c.appt_id,min(c.date) as LastDate 
    from tbl_appts_change_log c 
    INNER JOIN tbl_appts a on c.appt_id=a.ID 
    Where a.satellite_id='160' GROUP BY c.appt_id) d 
on c.appt_id = d.appt_id and c.date = d.LastDate 
group by u.firstName,u.lastName 
order by count(*) desc,u.firstName,u.lastName 
+0

hi leslie..thanks для этого SQL ... он отлично работает ... Я пробовал группу, но не пытался следующая его часть !!! – san4u28

+0

отлично! вы должны принять его как ответ тогда! Рад быть в состоянии помочь! – Leslie

1

я игнорирую свой код, как это, кажется, совершенно другой сценарий от того, что вы описали в своем вопросе Table1 и то есть Table2. Если все, что вы хотите, это минимальный срок для каждого ID все, что вам нужно, это

SELECT T1.ID, MIN(T2.Date) 
FROM Table1 T1 
    JOIN Table2 T2 ON T1.ID = T2.ID 
GROUP BY T1.ID 

Но я предполагаю, что вы действительно хотели что-то вроде этого?

Table 1 || Table 2- 
ID || ID Date Desc 

1 || 1 11/11/2010 AAA 
1 || 1 10/11/2010 BBB 
3 || 3 12/01/2010 CCC 
4 || 4 01/01/2010 DDD 
4 || 4 02/01/2010 EEE 

И ожидаемый результат

1 10/11/2010 BBB 
3 12/01/2010 CCC 
4 01/01/2010 DDD 

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

Метод 1: Используя номер строки

;WITH ResultCTE AS 
(
    SELECT T2.ID, T2.Date, T2.Desc, 
     RowNumber = ROW_NUMBER() OVER(PARTITION BY T2.ID ORDER BY T2.Date ASC) 
    FROM Table1 T1 
      JOIN Table2 T2 ON T1.ID = T2.ID 
)  
SELECT ID, Date, Desc 
FROM ResultCTE  
WHERE RowNumber = 1 

Метод 2: Вложенный запрос

;WITH ResultCTE AS 
(
    SELECT T2.ID, MIN(T2.Date) AS Date 
    FROM Table1 T1 
     JOIN Table2 T2 ON T1.ID = T2.ID 
    GROUP BY T2.ID 
) 
SELECT T.ID, T.Date, T.Desc 
FROM Table2 T 
    JOIN ResultCTE R 
     ON R.ID = T.ID AND R.Date = T.Date