1

私は次のダービーSQLステートメントを持っています:

    SELECT DISTINCT MEETINGS.MEETING_ID,
        MEETINGS.TITLE,
        RECORDING_FRAME.STARTTIME,
        RECORDING_FRAME.ENDTIME,
        {
                fn timestampdiff(SQL_TSI_FRAC_SECOND,
                RECORDING_FRAME.STARTTIME,
                RECORDING_FRAME.ENDTIME)
        } AS RUNTIMEFIELD_SESSIONDURATION
FROM APP.MEETINGS
JOIN APP.RECORDING ON
        MEETINGS.MEETING_ID=RECORDING.MEETINGID
JOIN APP.RECORDING_TRACK ON
        RECORDING.RECORDING_ID=RECORDING_TRACK.RECORDING_ID
JOIN APP.RECORDING_FRAME ON
        RECORDING.RECORDING_ID=RECORDING_FRAME.RECORDING_ID
WHERE RECORDING_FRAME.MODULE LIKE 'Recorder' AND
        MEETINGS.STATUS LIKE 'ENDED'

このクエリを実行すると、次の結果が得られます。

MEETING_ID  TITLE                 STARTTIME            ENDTIME              RUNTIMEFIELD_SESSIONDURATION  
----------  --------------------  -------------------  -------------------  ----------------------------  
65536       abc                   2013-03-06 21:28:49  (null)               (null)                        
65536       abc                   (null)               2013-03-06 21:30:04  (null)                        
65537       fasfasf               2013-03-06 21:13:13  (null)               (null)                        
65537       fasfasf               (null)               2013-03-06 21:13:40  (null)                        
360448      fasfffa               2013-03-06 21:31:07  (null)               (null)                        
360448      fasfffa               (null)               2013-03-06 21:38:13  (null)                        
360448      fasfffa               (null)               (null)               (null)                        
360450      test                  2013-03-06 22:07:31  (null)               (null)                        
360450      test                  (null)               2013-03-06 22:14:13  (null)                        
1605632     test benno            2013-03-19 18:21:03  (null)               (null)                        
1605632     test benno            (null)               2013-03-19 18:28:02  (null)                        
1605632     test benno            (null)               (null)               (null)                        
3211281     Conference Unni       2013-03-28 11:03:34  (null)               (null)                        
3211281     Conference Unni       (null)               2013-03-28 11:12:49  (null)                        
3211281     Conference Unni       (null)               (null)               (null)                        
3211283     test                  2013-03-28 10:51:27  (null)               (null)                        
3211283     test                  (null)               2013-03-28 10:59:13  (null)                        
3211283     test                  (null)               (null)               (null)                        
3211284     test (Copy)           2013-03-28 11:02:57  (null)               (null)                        
3211284     test (Copy)           (null)               2013-03-28 11:03:08  (null)                        
3211285     test (Copy) (Kopie)   2013-03-28 18:24:35  (null)               (null)                        
3211285     test (Copy) (Kopie)   (null)               2013-03-28 18:24:58  (null)                        
3211288     ss test               2013-03-28 17:02:20  (null)               (null)                        
3211288     ss test               (null)               2013-03-28 17:34:33  (null)                        
3211288     ss test               (null)               (null)               (null)

ここで、このリストの同じイベント (たとえば、イベント "abc") に、starttime と endtime の 2 つのレコードがあることは明らかです。この derby sql ステートメントを変更して、イベント "abc" starttime と endtime を 1 行で返すようにするにはどうすればよいですか?

4

2 に答える 2

1

私の見方では、テーブル RECORDING_FRAME には RECORDING_ID の RECORDING_TRACK で結合された 2 つまたは 3 つの行があるようです。1 つの行には starttime が null ではなく endtime は null、1 つの行には starttime が null で endtime は null ではなく、一部の記録には starttime と endtime が null の 3 行目もあります。あなたがする必要があるのは、結合(複数行)を結合(単一行)に変換することです。方法は次のとおりです。

最初に、starttime が null でない行のみを含む RECORDING_FRAME のビューを作成します。

Create view APP.VW_RF_START as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where STARTTIME is not null) 

ここで、endtime が null でない RECORDING_FRAME のレコードのみを含むビューを作成します。

Create view APP.VW_RF_END as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) 

ここで、recording_id で 2 つのビューを結合すると、同じ行に starttime と endtime があります。そして、あなたのクエリは次のとおりです。

SELECT DISTINCT 
 MEETINGS.MEETING_ID, MEETINGS.TITLE,
 VW_RF_START.STARTTIME, VW_RF_END.STARTTIME,
 {
            fn timestampdiff(SQL_TSI_FRAC_SECOND,
            RECORDING_FRAME.STARTTIME,
            RECORDING_FRAME.ENDTIME)
 } AS RUNTIMEFIELD_SESSIONDURATION
FROM APP.MEETINGS
JOIN APP.RECORDING ON
    MEETINGS.MEETING_ID=RECORDING.MEETINGID
JOIN APP.RECORDING_TRACK ON
    RECORDING.RECORDING_ID=RECORDING_TRACK.RECORDING_ID
JOIN APP.VW_RF_START ON
    RECORDING.RECORDING_ID=VW_RF_START.RECORDING_ID
JOIN APP.VW_RF_END ON
    RECORDING.RECORDING_ID=VW_RF_START.RECORDING_ID

WHERE RECORDING_FRAME.MODULE LIKE 'Recorder' AND MEETINGS.STATUS LIKE 'ENDED'

ビューを作成できない場合は、クエリで定義できます。

SELECT DISTINCT 
 MEETINGS.MEETING_ID, MEETINGS.TITLE,
 VW_RF_START.STARTTIME, VW_RF_END.STARTTIME,
 {
            fn timestampdiff(SQL_TSI_FRAC_SECOND,
            RECORDING_FRAME.STARTTIME,
            RECORDING_FRAME.ENDTIME)
 } AS RUNTIMEFIELD_SESSIONDURATION
FROM APP.MEETINGS
APP.RECORDING ON
    MEETINGS.MEETING_ID=RECORDING.MEETINGID
JOIN APP.RECORDING_TRACK ON
    RECORDING.RECORDING_ID=RECORDING_TRACK.RECORDING_ID
JOIN 
  (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) as VW_RF_START
ON
    RECORDING.RECORDING_ID=VW_RF_START.RECORDING_ID
JOIN 
  (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) as APP.VW_RF_END 
ON RECORDING.RECORDING_ID=VW_RF_START.RECORDING_ID
WHERE RECORDING_FRAME.MODULE LIKE 'Recorder' AND
    MEETINGS.STATUS LIKE 'ENDED'
于 2013-05-12T22:05:25.337 に答える