0

以下に示すように、PROCESS と STEP の 2 つのテーブルと、内部にいくつかのデータがあります。(1対Nの関係です。)

PROCESS ->

ID START_TIME STARTED_BY STATUS
1  31/08/2012 User1      FINISHED
2  31/08/2012 User2      FINISHED
3  05/09/2012 User3      ACTIVE

STEP ->

ID PROCESS_ID START_TIME END_TIME   STATUS
1  1          31/08/2012 02/09/2012 FINISHED  
2  1          02/09/2012 03/09/2012 FINISHED    
3  1          03/09/2012 10/09/2012 FINISHED  
4  2          31/08/2012 04/09/2012 FINISHED  
5  2          04/09/2012 06/09/2012 FINISHED  
6  2          06/09/2012 09/09/2012 FINISHED  
7  3          05/09/2012 06/09/2012 FINISHED    
8  3          06/09/2012 NULL       ACTIVE

必要なのはJOINです。これにより、以下のような完了プロセスの開始時間と終了時間が得られます。

PROCESS_ID START_TIME END_TIME  
1          31/08/2012 10/09/2012  
2          31/08/2012 09/09/2012

これを実現するには、どのような JOIN ステートメントを作成する必要がありますか?

4

2 に答える 2

2

PROCESS_ID 3 を取得しないようにするには、最初に集計とフィルター処理を行う必要があります

HAVING 句を使用すると、テーブル内の PROCESS_ID 3 のすべての行を確実に無視できSTEPます。シンプルにWHERE END_TIME IS NOT NULLやらWHERE .. 'FINISHED'ないと。どちらも JOIN の後に集計しません

SELECT
   P.PROCESS_ID,
   S.StartTime, S.EndTime
FROM
   PROCESS P
   JOIN
   (
   SELECT
      PROCESS_ID,
      MIN(START_TIME) AS StartTime,
      MAX(END_TIME) AS EndTime
   FROM
      STEP
   GROUP BY
      PROCESS_ID
   HAVING
      COUNT(*) = COUNT(END_TIME) -- only where we have no END_TIME nulls
   ) S ON P.PROCESS_ID = S.PROCESS_ID

たとえば、ACTIVE 行を無視する NOT EXISTS を使用するオプションは他にもありますが、ここでは END_TIME と NULL のみを使用して STEP 行を無視しています。

于 2012-09-13T11:58:50.207 に答える
1

and と関数INNER JOINを使用する必要があるようです。MINMAX

SELECT PROCESS.PROCESS_ID, MIN(START_TIME), MAX(END_TIME)
FROM PROCESS
INNER JOIN STEP ON STEP.PROCESS_ID = PROCESS.PROCESS_ID
GROUP BY PROCESS.PROCESS_ID
于 2012-09-13T11:59:31.977 に答える