Sql Derby Db行合并

Sql Derby Db行合并,sql,derby,Sql,Derby,我有以下derby sql语句: SELECT DISTINCT MEETINGS.MEETING_ID, MEETINGS.TITLE, RECORDING_FRAME.STARTTIME, RECORDING_FRAME.ENDTIME, { fn timestampdiff(SQL_TSI_FRAC_SECOND, RECORDING_FRAME.STAR

我有以下derby 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。如何修改此derby sql语句,使其在单行中返回事件“abc”开始时间和结束时间?

而不是
DISTINCT
使用
groupby
MAX(start)
MAX(end)

您的查询将如下所示:

SELECT id, title, MAX(start), MAX(end)
FROM ....
JOIN...
WHERE ...
GROUP BY id, title
由于聚合函数跳过
NULL
s,并且每个事件只有一个开始和结束,
MAX
将产生正确的结果

编辑:带持续时间计算

SELECT minmax.*, 
        {
          fn timestampdiff(SQL_TSI_FRAC_SECOND,
                minmax.StartTime,
                minmax.EndTime)
        } AS RUNTIMEFIELD_SESSIONDURATION
FROM 
    (SELECT id, title, MAX(start) As StartTime, MAX(end) As EndTime
    FROM ....
    JOIN...
    WHERE ...
    GROUP BY id, title) minmax

Derby文档中的表子查询部分:

而不是
DISTINCT
使用
groupby
MAX(start)
MAX(end)

您的查询将如下所示:

SELECT id, title, MAX(start), MAX(end)
FROM ....
JOIN...
WHERE ...
GROUP BY id, title
由于聚合函数跳过
NULL
s,并且每个事件只有一个开始和结束
MAX
将产生正确的结果

编辑:带持续时间计算

SELECT minmax.*, 
        {
          fn timestampdiff(SQL_TSI_FRAC_SECOND,
                minmax.StartTime,
                minmax.EndTime)
        } AS RUNTIMEFIELD_SESSIONDURATION
FROM 
    (SELECT id, title, MAX(start) As StartTime, MAX(end) As EndTime
    FROM ....
    JOIN...
    WHERE ...
    GROUP BY id, title) minmax

Derby docs中的表子查询部分:

在我看来,表录制帧似乎有2或3行与录制ID上的录制轨道相连。一行的开始时间不为null,但结束时间为null,一行的开始时间为null,但结束时间不为null,有些录音还有第三行starttime和endtime为空。您需要做的是将并集(多行)转换为联接(单行)。以下是您的操作方法:

首先创建一个只包含starttime不为null的行的录制帧视图

Create view APP.VW_RF_START as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where STARTTIME is not null) 
Create view APP.VW_RF_END as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) 
现在创建一个视图,该视图只包含endtime不为null的录制帧的记录

Create view APP.VW_RF_START as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where STARTTIME is not null) 
Create view APP.VW_RF_END as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) 
现在,如果将录制id的两个视图合并,则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
其中记录帧模块,如“记录器”和 会议。状态如“已结束”

如果无法创建视图,则可以在查询中定义它们:

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'

在我看来,表RECORDING_FRAME似乎有2或3行与RECORDING_ID上的RECORDING_TRACK连接。一行的starttime not null,但endtime null,一行的starttime null但endtime not null,有些录音还有第三行的starttime和endtime null。您需要做的是将并集(多行)转换为联接(单行)。以下是您的操作方法:

首先创建一个只包含starttime不为null的行的录制帧视图

Create view APP.VW_RF_START as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where STARTTIME is not null) 
Create view APP.VW_RF_END as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) 
现在创建一个视图,该视图只包含endtime不为null的录制帧的记录

Create view APP.VW_RF_START as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where STARTTIME is not null) 
Create view APP.VW_RF_END as
 (Select RECORDING_ID, STARTTIME from RECORDING_FRAME
  where ENDTIME is not null) 
现在,如果将录制id的两个视图合并,则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
其中记录帧模块,如“记录器”和 会议。状态如“已结束”

如果无法创建视图,则可以在查询中定义它们:

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'

我们是否保证每个事件只有一个开始和一个结束?我们是否保证每个事件只有一个开始和一个结束?我只得到一行(合并)-数据太少,RUNTIMEFIELD_SESSIONDURATION仍然为空!我现在做到了,谢谢你!我已经评论了用于持续时间计算的函数(将在Java中实现),并添加了groupbymeetings.TITLE,现在它就可以工作了!该死!现在,我必须按DATEFROM和DATETO之间的间隔过滤记录,我更新WHERE子句,然后我再也得不到任何记录!如果将当前查询转换为子查询并在主查询中计算了持续时间,则仍然可以使用持续时间函数。如果您有问题,请告诉我,我会将其添加到我的答案中。我的答案中包含了持续时间为
的查询。我只得到一行(合并)-数据太少,并且RUNTIMEFIELD\u SESSIONDURATION仍然为空!我现在做到了,谢谢你!我已经评论了用于持续时间计算的函数(将在Java中实现),并添加了groupbymeetings.TITLE,现在它就可以工作了!该死!现在,我必须按DATEFROM和DATETO之间的间隔过滤记录,我更新WHERE子句,然后我再也得不到任何记录!如果将当前查询转换为子查询并在主查询中计算了持续时间,则仍然可以使用持续时间函数。如果您有问题,请告诉我,我会将其添加到我的答案中。我的答案中包含了持续时间为
的查询。我不允许更改数据库(通过创建视图,否则,太棒了!)不需要创建视图。视图可以位于查询内部。我编辑以包含该选项。我不允许更改数据库(通过创建视图,否则,太棒了!)不需要创建视图。视图可以位于查询内部。我编辑以包含该选项。