Sql Derby Db行合并
我有以下derby sql语句: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
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子句,然后我再也得不到任何记录!如果将当前查询转换为子查询并在主查询中计算了持续时间,则仍然可以使用持续时间函数。如果您有问题,请告诉我,我会将其添加到我的答案中。我的答案中包含了持续时间为的查询。我不允许更改数据库(通过创建视图,否则,太棒了!)不需要创建视图。视图可以位于查询内部。我编辑以包含该选项。我不允许更改数据库(通过创建视图,否则,太棒了!)不需要创建视图。视图可以位于查询内部。我编辑以包含该选项。