大神们 需求是这样的 通过项目ID,获取这个项目的获取这个项目的最近操作记录,按操作方式分类(也就是这个项目中每种操作方式的最近操作记录),如下:ID 项目ID 操作方式 操作时间 操作员
1 1 手动 2013-3-5 A
2 1 自动 2013-5-5 B
3 2 手动 2013-6-6 A
4 1 手动 2013-6-6 A
5 1 自动 2013-6-7 A
6 2 自动 2013-6-7 B比如 我查询项目ID=1的数据,要得到的结果如下ID 项目ID 操作方式 操作时间 操作员
4 1 手动 2013-6-6 A
5 1 自动 2013-6-7 A 请神指教 我只能得到项目ID、操作方式、操作时间 3项 ,如果要获取一整行的数据就不行了。 SELECT 操作方式 ,
项目ID ,
MAX(操作时间)
FROM [项目]
WHERE 项目ID IN =1
GROUP BY 操作方式 ,
项目ID
1 1 手动 2013-3-5 A
2 1 自动 2013-5-5 B
3 2 手动 2013-6-6 A
4 1 手动 2013-6-6 A
5 1 自动 2013-6-7 A
6 2 自动 2013-6-7 B比如 我查询项目ID=1的数据,要得到的结果如下ID 项目ID 操作方式 操作时间 操作员
4 1 手动 2013-6-6 A
5 1 自动 2013-6-7 A 请神指教 我只能得到项目ID、操作方式、操作时间 3项 ,如果要获取一整行的数据就不行了。 SELECT 操作方式 ,
项目ID ,
MAX(操作时间)
FROM [项目]
WHERE 项目ID IN =1
GROUP BY 操作方式 ,
项目ID
where not exists(select 1 from [项目] where 项目ID = a.项目ID and 操作方式 = a.操作方式 and 操作时间>a.操作时间)
FROM [ 项目 ] GROUP BY 操作方式, 项目ID HAVING 项目ID = 1
当然这种的效果不好,期待楼下回答。
declare @tb table(ID int,项目ID int,操作方式 varchar(10),操作时间 varchar(10),操作员 varchar(5))
insert into @tb
select 1,1,'手动','2013-3-5','A' union all
select 2,1,'自动','2013-5-5','B' union all
select 3,2,'手动','2013-6-6','A' union all
select 4,1,'手动','2013-6-6','A' union all
select 5,1,'自动','2013-6-7','A' union all
select 6,2,'自动','2013-6-7','B'select * from @tb where [项目ID]=1 and [操作时间] in(
select [操作时间] from(
select [操作方式],MAX([操作时间]) as [操作时间]
from @tb where [项目ID]=1
group by [操作方式]
)a)ID 项目ID 操作方式 操作时间 操作员
----------- ----------- ---------- ---------- -----
4 1 手动 2013-6-6 A
5 1 自动 2013-6-7 A(2 行受影响)
select * from @tb where [项目ID]=1 and [操作时间] in(
select [操作时间] from(
select [操作方式],MAX([操作时间]) as [操作时间]
from @tb where [项目ID]=1
group by [操作方式]
)a)select * from @tb a
where a.项目ID=1
and not exists(
select top(1)1 from @tb
where 项目ID = a.项目ID
and 操作方式 = a.操作方式
and 操作时间>a.操作时间
)
FROM (SELECT DISTINCT 项目ID, 操作方式 FROM [项目]) a
CROSS APPLY
(SELECT TOP(1) * FROM [项目] m WHERE m.项目ID = a.项目ID AND m.操作方式 = a.操作方式 ORDER BY 操作时间 DESC) b
WITH temp(ID,PID,Types,Dates,Users)
AS
(
SELECT 1,1,N'手动','2013-3-5','A'
UNION ALL
SELECT 2,1,N'自动','2013-5-5','B'
UNION ALL
SELECT 3,2,N'手动','2013-6-6','A'
UNION ALL
SELECT 4,1,N'手动','2013-6-6','A'
UNION ALL
SELECT 5,1,N'自动','2013-6-7','A'
UNION ALL
SELECT 6,2,N'自动','2013-6-7','B'
)
SELECT A.*
FROM temp AS A
JOIN (
SELECT PID,Types,MAX(Dates) AS Dates
FROM temp
GROUP BY PID,Types
HAVING PID=1) AS B ON A.PID=B.PID AND A.Dates=B.Dates
GO/****** Object: Table [dbo].[Table_1] Script Date: 08/05/2013 11:35:53 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE TABLE [dbo].[Table_1](
[id] [int] NOT NULL,
[pid] [int] NOT NULL,
[op_type] [varchar](50) NOT NULL,
[op_time] [datetime] NULL,
[op_man] [varchar](50) NULL
) ON [PRIMARY]GOSET ANSI_PADDING OFF
GO
查询语句select * from
(
SELECT t.*,ROW_NUMBER() over (partition by t.pid order by t.op_time desc) num
FROM [master].[dbo].[Table_1] t
) a
where num=1
这个我测试了得到的结果不对啊
测试语句SELECT b.*
FROM (SELECT DISTINCT pid, op_type FROM [Table_1]) a
CROSS APPLY
(SELECT TOP(1) * FROM [Table_1] m WHERE m.pid = a.pid AND m.op_type = a.op_type ORDER BY op_time DESC) b
结果
declare @tb table(ID int,项目ID int,操作方式 varchar(10),操作时间 varchar(10),操作员 varchar(5))
insert into @tb
select 1,1,'手动','2013-3-5','A' union all
select 2,1,'自动','2013-5-5','B' union all
select 3,2,'手动','2013-6-6','A' union all
select 4,1,'手动','2013-6-6','A' union all
select 5,1,'自动','2013-6-7','A' union all
select 6,2,'自动','2013-6-7','B'select * from @tb a
where a.操作时间 in
(select top(1) MAX(b.操作时间) from @tb b where a.操作方式=b.操作方式
)
insert into @tb
select 1,1,'手动','2013-3-5','A' union all
select 2,1,'自动','2013-5-5','B' union all
select 3,2,'手动','2013-6-6','A' union all
select 4,1,'手动','2013-6-6','A' union all
select 5,1,'自动','2013-6-7','A' union all
select 6,2,'自动','2013-6-7','B'
select * from @tb a
where a.操作时间 in
(select top(1) b.操作时间 from @tb b where a.操作方式=b.操作方式
order by b.操作时间 desc
)