2014-09-02 6 views
0

Мне нужно создать запрос, чтобы сделать следующий, с данными с такими же КЛИЕНТАМИ, ДАТАМИ и СОСТОЯНИЕМ, чтобы выбрать максимальную дату выполнения и подсчитать ее. Я думаю, что с примером будет легче разобраться.SQL - COUNT DISTINCT

Из этой таблицы, например,

Client  Status   Date    Date Execution   
-------  ----------  ------   ---------------------   
AB   100   22/07/2014  23/07/2014 21:35 
AB   100   22/07/2014  23/07/2014 05:00 
AB   100   22/07/2014  23/07/2014 19:32 
AB   100   23/07/2014  24/07/2014 04:15 
AB   100   23/07/2014  24/07/2014 20:19 
BC   400   24/07/2014  25/07/2014 20:56 
BC   400   24/07/2014  25/07/2014 03:36 
BC   400   24/07/2014  25/07/2014 17:58 
BC   400   24/07/2014  25/07/2014 14:51 

Я хотел бы получить,

Client  Status   Date    Date Execution   COUNT(Distint) 
------- ----------  ------   ---------------------  ---------------------- 
AB    100  22/07/2014  23/07/2014 21:35    3 
AB    100  23/07/2014  24/07/2014 20:19    2 
BC    400  24/07/2014  25/07/2014 20:56    4 

На данный момент я сделал этот запрос, чтобы сделать поиск выполнения даты макс, но я не знаю, как сделать для COUNT (DISTINCT).

SELECT ip.CLIENT, cps.DATE, cpst.STATUS, cpst.DATE_EXE 

FROM IP ip, CPS cps, CPST cpst INNER JOIN (SELECT PF_GUID, MAX(DATE_EXE) 
              FROM CTR_PORTFOLIOS_TRG 
              GROUP BY PF_GUID) cpst2 ON cpst.PF_GUID=cpst2.PF_GUID 

WHERE ip.PF_ID = cps.PF_ID AND cps.PF_GUID = cpst.PF_GUID 
     AND cpst.STATUS IN (100,400,550) 
     AND cps.DATE BETWEEN TO_DATE('01/07/2014', 'DD/MM/YYYY') AND TO_DATE('30/09/2014', 'DD/MM/YYYY') 

ORDER BY CLIENT, STATUS, DATE 

Любая помощь, пожалуйста, заполните запрос? Большое спасибо

+1

Для чего нужна платформа базы данных? Пожалуйста, отметьте соответствующим образом. – OldProgrammer

+0

Это выглядит как Oracle или Postgres из-за использования 'to_date()'. –

+0

Да, его Oracle – abetitou

ответ

1

Если я правильно понимаю, это основной запрос агрегации. Я думаю, вы могли бы спутать себя:

SELECT ip.CLIENT, cpst.STATUS, MIN(cps.date), MAX(cpst.DATE_EXE), COUNT(*) 
FROM IP ip JOIN 
    CPS cps 
    ON ip.PF_ID = cps.PF_ID JOIN 
    CPST cpst 
    ON cps.PF_GUID = cpst.PF_GUID 
WHERE cpst.STATUS IN (100,400,550) AND 
     cps.DATE BETWEEN DATE '2014-07-01' and DATE '2014-09-30' 
GROUP BY ip.CLIENT, cps.STATUS; 

Примечания:

  • Заменен неявные соединяется с явным присоединяется. Простое правило: никогда не используйте запятые в предложении from.
  • Удалено подзапрос агрегации.
  • Изменен формат использования идентификатора Oracle DATE для константы.
  • Используйте MAX(), чтобы получить самую свежую дату/время.
  • Используйте COUNT(*), чтобы получить счет. Я не уверен, что вы подразумеваете под distinct, но для результатов выборки достаточно count(*).
+0

Спасибо за ваш ответ, но мне нужно получить максимальную дату-время от каждого дня, а не максимум. Вот почему я сделал суб-выбор с участием innner join. Но он не работает, как я это сделал, потому что счет должен иметь (CLIENT, STATUS, DATE) не (DATE_EXE). – abetitou

+0

С этим запросом он работает хорошо: – abetitou

+0

SELECT ip.CLIENT, cpst.STATUS, cps.DATE, COUNT (*) FROM INT_PORTFOLIO ip, CTR_PORTFOLIOS cps, CTR_PORTFOLIOS_TRG cpst WHERE ip.PF_ID = cps.PF_ID И cps.PF_GUID = cpst. PF_GUID И cpst.STATUS IN (100 400 500) И cps.DATE МЕЖДУ TO_DATE ('01/07/2014 ',' DD/MM/YYYY ') И TO_DATE ('30/09/2014', 'DD/MM/YYYY') GROUP BY ip.CLIENT, cpst.STATUS, cps.DATE ORDER by CLIENT, STATUS, DATE Но теперь я не знаю, как добавить в последний столбец максимальную дату_EXE каждого дня – abetitou

1
SELECT Client, 
     [Status], 
     [Date], 
     MAX([Date Execution]) [Date Execution], 
     COUNT(*) [Count(Distinct)] 
FROM YourTable 
GROUP BY Client, 
     [Status], 
     [Date] 
+0

+1 Ты избил меня. =) –