这样一个场景要怎样查询呢
想过之后对自己的SQL能力产生了质疑,因为觉得肯定要用存储过程,借助临时表。所以接着来求助大家有没有更好的办法。
完整的场景就是
Message表中有字段 ID FromID ToID
比如现在有数据是
ID FromID ToID IsNew
1 103 102 true
2 102 103 false
3 103 102 true
4 104 102 true
5 105 102 true
from代表发送方,to代表接收方。
按发送方和接收方捆绑分组,比如参与者是103和102的时候,不管103发给102,还是102发给103都算是这一组的,然后取出每组最近的一条。
上面的已经在那个帖子结果了,后续的是,需要取出两个统计字段,一个是统计一组中共有多少条数据,一个是统计一组中有多少条新数据(用IsNew字段标识的)。
按照如上模拟数据的话,取出来的应该是
ID FromID ToID AllCount NewCount
1 103 102 3 2
4 104 102 1 1
5 105 102 1 1
[解决办法]
自己多思考,多学习,不要老想别人给你答案
[解决办法]
declare @message table(id int,fromid int,toid int,isnew int)
insert into @message
select 1 , 103 , 102,1 union all
select 2 , 102 , 103,0 union all
select 3 , 103 , 102,1 union all
select 4 , 104 , 102,1 union all
select 5 , 105 , 102,1
;
with tb as(
select id,fromid,toid,isnew,
case when fromid<toid then fromid else toid end as newfromid,
case when fromid<toid then toid else fromid end as newtoid
from @message )
select b.id,c.fromid,c.toid,b.allcount,b.newcount from
(
select MIN(id) id,COUNT(1) allcount,SUM(isnew) as newcount
from (
select id,fromid,toid,isnew,dense_rank() over(order by newfromid,newtoid) as rowid
from tb) as a
group by rowid) as b inner join tb as c on b.id=c.id
[解决办法]
CREATE TABLE test1 (ID INT, FromID INT, ToID INT, IsNew VARCHAR(20))
INSERT INTO test1
SELECT 1,103, 102,'true' UNION ALL
SELECT 2,102, 103,'false' UNION ALL
SELECT 3,103, 102,'true' UNION ALL
SELECT 4,104, 102,'true' UNION ALL
SELECT 5,105, 102,'true'
SELECT
Min(ID) ID,
CASE WHEN FromID>=ToID THEN FromID ELSE ToID END FromID,
CASE WHEN FromID<ToID THEN FromID ELSE ToID END ToID,
COUNT(1) AllCount,
COUNT(CASE WHEN IsNew='true' THEN 1 ELSE NULL END) NewCount
FROM TEST1
GROUP BY
CASE WHEN FromID>=ToID THEN FromID ELSE ToID END,
CASE WHEN FromID<ToID THEN FromID ELSE ToID END
------------------
ID FromID ToID AllCount NewCount
----------- ----------- ----------- ----------- -----------
1 103 102 3 2
4 104 102 1 1
5 105 102 1 1