大神们  需求是这样的  通过项目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.   

    select * from [项目] a
    where not exists(select 1 from [项目] where 项目ID = a.项目ID and 操作方式 = a.操作方式 and 操作时间>a.操作时间)
      

  2.   

    SELECT 操作方式, 项目ID, MAX(操作时间)
      FROM [ 项目 ] GROUP BY 操作方式, 项目ID HAVING  项目ID = 1
      

  3.   


    当然这种的效果不好,期待楼下回答。
    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 行受影响)
      

  4.   


    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.操作时间
    )
      

  5.   

    SELECT B.*
    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
      

  6.   


    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
      

  7.   

    建表语句USE [master]
    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
      

  8.   


    这个我测试了得到的结果不对啊
    测试语句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
    结果
      

  9.   


    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.操作方式 
      )
      

  10.   

    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) b.操作时间   from @tb b where  a.操作方式=b.操作方式 
    order by b.操作时间 desc
      )