mssql重复语句分类取每类中一条

时间:2022-09-17 15:03:17
大家好,今天在做查询的时候遇到一个问题,自己是了很多遍弄不出来,特来求救,
比如一张表保存图书的进出,图书可能是一本,可能是一箱,一箱书有先申请来拿,可同意,可拒绝,如果那箱书不存在管理员肯定会拒绝申请的,或别的问题,
每一次操作操作一次数据库,一箱书里面有多少本书就插入多少条数据,箱子ID相同,和创建这次事件的事件相同。
但是同一个箱子id可能,有同意的状态,有拒绝的状态,有正在申请的状态,但是肯定时间是不对的,
状态0代表申请,1代表同意,2代表拒绝,现在需要做的事相同boxid,相同createtime,相同status显示为一条,
但是同一箱书拒绝过多次也作为一条,并显示已经拒绝了几次,同理同意过多少次也统计出同意过多少次,并以一条显示,
mssql重复语句分类取每类中一条

8 个解决方案

#1



select boxid,createtime,boxstatus,count(1) times
from tb
group by boxid,createtime,boxstatus


这样?

#2


引用 1 楼 stublue 的回复:

select boxid,createtime,boxstatus,count(1) times
from tb
group by boxid,createtime,boxstatus


这样?

这一步我也走到过,是能拿到每一次事件的时间,和boxid但是其他信息怎么获取,如果能以此为条件拿到每一次事件中的TID就好了,然后再根据TID查询整条数据。

#3


如果按boxid分组后有多个tid,不知道楼主要哪个tid。

建议:

select *,
(select count(1) from tablename where boxid=t.boxid and boxstatus=0) as 申请次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=1) as 同意次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=2) as 拒绝次数
from tablename t

#4


mssql重复语句分类取每类中一条
就像如果能把null的以时间为条件相同就填充进去就好了。

#5


引用 3 楼 maco_wang 的回复:
如果按boxid分组后有多个tid,不知道楼主要哪个tid。

建议:

select *,
(select count(1) from tablename where boxid=t.boxid and boxstatus=0) as 申请次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=1) as 同意次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=2) as 拒绝次数
from tablename t

如果按boxid分组后有多个tid--如果按照时间与boxid分组后得到的有多个tid那么随便取中间一个都可以,因为这个tid的boxid createid 与status是一样的。

#6


把上面的数据给个脚本,然后告诉我你想要的结果,图中数据只有两个boxid,以此数据为例,你要什么样的结果?

#7


SELECT * FROM (SELECT boxid,createtime FROM TestTable WHERE boxid='1234-OD-20130628095548' GROUP BY boxid,createtime) tt LEFT OUTER JOIN (SELECT TOP 1 * FROM TestTable ) ta ON tt.createtime=ta.createtime

mssql重复语句分类取每类中一条
我自己查询了只填充了一条,如果能根据时间,boxid,status填充另外两条就好了,
就是先分组,然后以分组数据为标准拿到分组中的其中一条详细信息,呃,语文似乎不太好,不知道版主理解没。

#8


CREATE TABLE [dbo].[TestTable](
[TID] [uniqueidentifier] NULL,
[BOXID] [nvarchar](50) NULL,
[BOOKID] [uniqueidentifier] NULL,
[StudentName] [nvarchar](50) NULL,
[CreateTime] [datetime] NULL,
[BoxStatus] [int] NULL
) ON [PRIMARY]


insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:48:10.037',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:48:10.037',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:51:46.423',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:51:46.423',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:11:33.970',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:11:33.970',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:14:13.410',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:14:13.410',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:22:01.160',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:22:01.160',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:30:28.927',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:30:28.927',0)

#1



select boxid,createtime,boxstatus,count(1) times
from tb
group by boxid,createtime,boxstatus


这样?

#2


引用 1 楼 stublue 的回复:

select boxid,createtime,boxstatus,count(1) times
from tb
group by boxid,createtime,boxstatus


这样?

这一步我也走到过,是能拿到每一次事件的时间,和boxid但是其他信息怎么获取,如果能以此为条件拿到每一次事件中的TID就好了,然后再根据TID查询整条数据。

#3


如果按boxid分组后有多个tid,不知道楼主要哪个tid。

建议:

select *,
(select count(1) from tablename where boxid=t.boxid and boxstatus=0) as 申请次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=1) as 同意次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=2) as 拒绝次数
from tablename t

#4


mssql重复语句分类取每类中一条
就像如果能把null的以时间为条件相同就填充进去就好了。

#5


引用 3 楼 maco_wang 的回复:
如果按boxid分组后有多个tid,不知道楼主要哪个tid。

建议:

select *,
(select count(1) from tablename where boxid=t.boxid and boxstatus=0) as 申请次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=1) as 同意次数,
(select count(1) from tablename where boxid=t.boxid and boxstatus=2) as 拒绝次数
from tablename t

如果按boxid分组后有多个tid--如果按照时间与boxid分组后得到的有多个tid那么随便取中间一个都可以,因为这个tid的boxid createid 与status是一样的。

#6


把上面的数据给个脚本,然后告诉我你想要的结果,图中数据只有两个boxid,以此数据为例,你要什么样的结果?

#7


SELECT * FROM (SELECT boxid,createtime FROM TestTable WHERE boxid='1234-OD-20130628095548' GROUP BY boxid,createtime) tt LEFT OUTER JOIN (SELECT TOP 1 * FROM TestTable ) ta ON tt.createtime=ta.createtime

mssql重复语句分类取每类中一条
我自己查询了只填充了一条,如果能根据时间,boxid,status填充另外两条就好了,
就是先分组,然后以分组数据为标准拿到分组中的其中一条详细信息,呃,语文似乎不太好,不知道版主理解没。

#8


CREATE TABLE [dbo].[TestTable](
[TID] [uniqueidentifier] NULL,
[BOXID] [nvarchar](50) NULL,
[BOOKID] [uniqueidentifier] NULL,
[StudentName] [nvarchar](50) NULL,
[CreateTime] [datetime] NULL,
[BoxStatus] [int] NULL
) ON [PRIMARY]


insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:04.187',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 09:56:57.800',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('1234-OD-20130628095548','yml','2013-06-28 10:03:05.907',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:48:10.037',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:48:10.037',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:51:46.423',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 16:51:46.423',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:11:33.970',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:11:33.970',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:14:13.410',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:14:13.410',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:22:01.160',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:22:01.160',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:30:28.927',0)
insert TestTable(BOXID,StudentName,CreateTime,BoxStatus) values ('doee-OD-20130618163055','ddzz1.com','2013-06-18 17:30:28.927',0)