2014-03-19 27 views
1

有两个表会议查看其中一个会话可能包含许多观点:选择不包括连接表的第一行和最后一行

Session  
id | app | other_columns 
------------------ 
1 | A | text 
2 | A | text 

View  
id | session | name | start |  end 
--------------------------------------------- 
1 | 1  | A | 1395221810 | 1395221836 
2 | 1  | B | 1395221837 | 1395221945 
3 | 1  | A | 1395221846 | 1395221998 
4 | 2  | A | 1392241521 | 1392241563 
5 | 2  | G | 1392241564 | 1392241565 
6 | 2  | F | 1392241566 | 1392241579 
7 | 2  | I | 1392241580 | 1392241596 
8 | 2  | J | 1392241596 | 1392241612 

现在我想获得的平均长度所有会话的(从的总和计算 - 开始为属于会话中的每个视图)其中,app =“A”,但不包括每个会话的第一和最后一个视图(即行)。在上面的例子,视图1 + 3(属于会话1)和4 + 8(会话2)应该被排除在计算之外。

我开始与这个样子的,但很明显,它不包含第一+最后一排斥声明:

SELECT 
    AVG(v.end - v.start) 
FROM 
    View AS v 
     JOIN 
    Session AS s ON s.ID = v.session 
WHERE 
    s.app = 'A'; 

回答

2
select max(id) as max_id, min(id) as min_id, session 
from view 
group by sesion; 

的ID被排除在外。

select * 
from view 
    left join (select max(id) as max_id, min(id) as min_id, session 
       from view 
       group by sesion) exclude ON view.session=exclude.session 
        AND (view.id=exclude.min_id or view.id=exclude.max_id) 
having exclude.session is null; 

视图数据,而不排除ID的

select session, avg(end-start) from (
    select * 
    from view 
     left join (select max(id) as max_id, min(id) as min_id, session 
        from view 
        group by sesion) exclude ON view.session=exclude.session 
         AND (view.id=exclude.min_id or view.id=exclude.max_id) 
    having exclude.session is null) pure_data 
group by session 

平均数据

+0

谢谢您的回答,看起来相当有前途的!使用此查询,我不断收到错误说“重复列名‘会议’”。另外,我想将结果集限制为具有app ='A'的会话。 – tilo

+0

它measn有2列有姓名** **会话。只需添加{alial} .session。您可以将应用程序=“A”到查询 – StanislavL

+0

但为了包括应用程序,我不得不做另一个连接,右(因为在你的榜样,不使用会话表)? – tilo

相关问题