我有两个表事件和会话,它们看起来像下面的 第二张桌子 这是我希望从上表中看到的结果,预期结果 现在,当我运行以下查询时 我得到以下结果 我需要做什么才能得到我想要的东西? 答案 0 :(得分:3) 将仅计算sid不为null的所有行。您可能想要: 此外,您似乎在会话表(ter4)中没有的事件表中有sid,反之亦然-正确的连接将从事件中没有相应条目的事件中排除行-这就是您想要的吗?</
答案 1 :(得分:1) 您需要更多数据来计算匹配的sid-在这种情况下,我使用了生成的行号。会话总数似乎只是第二张表中的最大ID。 答案 2 :(得分:0) 您可以使用左连接,左侧表中的count(id)将返回Total_sessions,右侧表中的count(id)将返回所有非null值的计数,在这种情况下,所有与两个表。 这是一个例子events
id sid
1 10
2 10
3 20
4 20
6 ter4
7 576
sessions
id sid
1 10
2 10
3 20
4 20
6 e21
7 b34
Total_sessions Total_equal_sessions
7 4
SELECT sessions.sid, COUNT(*) AS Total_sessions, COUNT( sessions.sid ) AS Total_equal_sessions
FROM events RIGHT JOIN sessions ON events.sid = sessions.sid
Total_sessions Total_equal_sessions
7 7
3 个答案:
COUNT(sessions.sid)
COUNT(DISTINCT sessions.sid)
drop table if exists t,t1;
create table t
(id int, sid varchar(10));
insert into t values
(1 , '10'),
(2 , '10'),
(3 , '20'),
(4 , '20'),
(6 , 'ter4'),
(7 , '576');
create table t1
(id int, sid varchar(10));
insert into t1 values
(1 , '10'),
(2 , '10'),
(3 , '20'),
(4 , '20'),
(6 , 'A'),
(7 , 'b');
select (select max(id) from t1) sessions,sum(case when t1.sid1 = t.sid and t1.rn1 = t.rn then 1 else 0 end) matched
from
(select sid,row_number() over (partition by sid order by sid) rn from t) t
right join
(select sid sid1,row_number() over (partition by sid order by sid) rn1 from t1) t1
on t1.sid1 = t.sid and t1.rn1 = t.rn
+----------+---------+
| sessions | matched |
+----------+---------+
| 7 | 4 |
+----------+---------+
1 row in set (0.00 sec)
create table #events(id int, sid varchar(10))
create table #sessions(id int, sid varchar(10))
insert #events
select * from (values(1,'10'),(2,'10'),(3,'20'),(4,'20'),(5,'abc'),(6,'ter4'),(7,'576')) a(id,sid)
insert #sessions
select * from (values(1,'10'),(2,'10'),(3,'20'),(4,'20'),(5,'xyz'),(6,'e21'),(7,'b34')) a(id,sid)
select count(e.id) Total_sessions, count(s.id) Total_equal_sessions
from #events e left join
#sessions s on e.id = s.id and e.sid = s.sid