对一对字段同时执行SQL查询

对一对字段同时执行SQL查询,sql,oracle,Sql,Oracle,我有一张这样的桌子: name | action | action_timestamp ------------------------------------------ ABC | START_PLAY | 2017-02-02 10:00:00 PQR | START_PLAY | 2017-02-02 11:00:00 ABC | END_PLAY | 2017-02-02 10:30:00 PQR | END_PLAY | 2017-02

我有一张这样的桌子:

name | action      |    action_timestamp
------------------------------------------
ABC  | START_PLAY  |  2017-02-02 10:00:00
PQR  | START_PLAY  |  2017-02-02 11:00:00
ABC  | END_PLAY    |  2017-02-02 10:30:00
PQR  | END_PLAY    |  2017-02-02 11:05:00  
SELECT DISTINCT name FROM TBL WHERE action='START_PLAY' and action_timestamp >= '2017-02-02 10:00:00'
INTERSECT
SELECT DISTINCT name FROM TBL WHERE action='END_PLAY' and action_timestamp <= '2017-02-02 10:30:00'
我想得到所有在给定时间戳上或之后开始播放并在给定时间戳上或之前结束播放的姓名

例如,如果action='START'u PLAY'和action'u timestamp>=2017-02-02 10:00:00,action='END'u PLAY'和action'u timestamp尝试以下操作:

SELECT *
FROM yourtable t1
WHERE EXISTS(
    SELECT 'STARTING'
    FROM yourtable t2
    WHERE t2.name = t1.name
    AND t2.action = 'START_PLAY'
    AND t2.timestamp >= '2017-02-02 10:30:00')
AND EXISTS (
    SELECT 'ENDING'
    FROM yourtable t3
    WHERE t3.name = t1.name
    AND t3.action = 'START_PLAY'
    AND t3.timestamp <= '2017-02-02 10:00:00')
假设每个名称正好存在一行用于开始播放,一行用于结束播放,您可以使用如下内容:

select name, start_play, end_play
from (
        select name,
               max ( case when action = 'START_PLAY' then action_timestamp end) as start_play,
               max ( case when action = 'END_PLAY' then action_timestamp end) as end_play
        from yourTable 
        group by name
     )                 
where start_play > ...
  and end_play < ...     
嵌套查询对表执行一次扫描,并为每个名称创建一行,行上有start_play和end_play;外部部分只是将筛选器应用于内部查询产生的行。

尝试以下操作:

SELECT *
FROM yourtable t1
WHERE EXISTS(
    SELECT 'STARTING'
    FROM yourtable t2
    WHERE t2.name = t1.name
    AND t2.action = 'START_PLAY'
    AND t2.timestamp >= '2017-02-02 10:30:00')
AND EXISTS (
    SELECT 'ENDING'
    FROM yourtable t3
    WHERE t3.name = t1.name
    AND t3.action = 'START_PLAY'
    AND t3.timestamp <= '2017-02-02 10:00:00')

像这样使用intersect:

name | action      |    action_timestamp
------------------------------------------
ABC  | START_PLAY  |  2017-02-02 10:00:00
PQR  | START_PLAY  |  2017-02-02 11:00:00
ABC  | END_PLAY    |  2017-02-02 10:30:00
PQR  | END_PLAY    |  2017-02-02 11:05:00  
SELECT DISTINCT name FROM TBL WHERE action='START_PLAY' and action_timestamp >= '2017-02-02 10:00:00'
INTERSECT
SELECT DISTINCT name FROM TBL WHERE action='END_PLAY' and action_timestamp <= '2017-02-02 10:30:00'

使用名称进行自联接。检查开始和结束之间的时间戳。从表1中选择*,其中action_timestamp>='2017-02-02 10:00:00'和action_timestamp我对该表的设计不太满意。同一个名字能否出现多次,即多次开始和多次结束?我会考虑一个开始栏和一个结束栏,也就是把它们放在同一行。谢谢。然而,如果我们参考表格,如果他在给定的时间戳内多次正确地开始和结束,这不会拉动“ABC”多次,这是由于团队的原因,但是如果出现多次,我不能说这个结果是否适合你。你能发布一个多次出现的例子,解释在这种情况下该怎么做吗?