前提你必须指定一个ID,先not exsit排除生产产品,生产日期,生产班次相同的数据,然后对结果集按生产产品做分组排序(rownumber over partition by order by 生产日期 desc,ID desc)然后取rownumber为1的就是你要数据

解决方案 »

  1.   


    create table sn
    (ID int,生产产品 varchar(10),生产日期 varchar(12),生产班次 varchar(12),生产工人 varchar(12),生产单号 int)insert into sn
     select 1,'螺丝钉','2014-6-15','早班','张三',111 union all
     select 2,'螺丝钉','2014-6-15','早班','李四',111 union all
     select 3,'螺母','2014-6-15','晚班','王五',112 union all
     select 4,'螺丝钉','2014-6-16','早班','李四',111 union all
     select 5,'螺丝钉','2014-6-16','早班','张三',111 union all
     select 6,'螺母','2014-6-16','早班','王五',112
     select a.*,c.生产日期 '上一个班次',c.生产班次 '上一个班次时间'
     from sn a
     outer apply
     (select top 1 b.生产日期,b.生产班次
      from sn b
      where b.生产产品=a.生产产品 and b.生产日期<a.生产日期) c/*
    ID          生产产品       生产日期         生产班次         生产工人         生产单号        上一个班次        上一个班次时间
    ----------- ---------- ------------ ------------ ------------ ----------- ------------ ------------
    1           螺丝钉        2014-6-15    早班           张三           111         NULL         NULL
    2           螺丝钉        2014-6-15    早班           李四           111         NULL         NULL
    3           螺母         2014-6-15    晚班           王五           112         NULL         NULL
    4           螺丝钉        2014-6-16    早班           李四           111         2014-6-15    早班
    5           螺丝钉        2014-6-16    早班           张三           111         2014-6-15    早班
    6           螺母         2014-6-16    早班           王五           112         2014-6-15    晚班(6 row(s) affected)
    */
      

  2.   


    谢谢大神,能分开写吗?不用一条sql语句
      

  3.   

    应该是没办法拆分.
    能一条SQL语句解决的问题,为不用一条SQL语句解决呢?
      

  4.   

    你就用版主这个吧,你上面那个问题,取top 1的时候按照id desc排下序吧
      

  5.   

    SELECT  * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY ws_material,ws_making,WS_techDiameter,WS_techColor,ws_banci,ws_outputdate ORDER BY WS_ID DESC) AS ID1        ,*    FROM hr_BraidStatisticsdetail     ) AS A WHERE A.ID1=2 and WS_ContractNO='111' order by WS_ID desc
     
    这样会得到很多111的值,哪里错了呢 
      

  6.   

    try this,select a.*,c.生产日期 '上一个班次',c.生产班次 '上一个班次时间'
     from sn a
     outer apply
     (select top 1 b.生产日期,b.生产班次
      from sn b
      where b.生产产品=a.生产产品 
      and (b.生产日期<a.生产日期
           or (b.生产日期=a.生产日期 and a.生产班次='晚班' and b.生产班次<>a.生产班次))
      order by case b.生产班次 when '晚班' then 1 when '早班' then 2 end      
     ) c
      

  7.   


    declare @galenkeny table(id int,生产产品 varchar(20),生产日期 datetime, 生产班次 varchar(20),生产工人 varchar(20), 生产单号 varchar(20))
    insert into @galenkenyselect'1', '螺丝钉', ' 2014-6-15','早班',' 张三','111' union all
    select'2', '螺丝钉', ' 2014-6-15','早班',' 李四','111' union all
    select'3', '螺母',   ' 2014-6-15','晚班',' 王五','112' union ALL
    select'4', '螺丝钉', ' 2014-6-16','早班',' 李四','111' union ALL
    select'5', '螺丝钉', ' 2014-6-16','早班',' 张三','111' union ALL
    select'6', '螺母',   ' 2014-6-16','早班',' 王五','112' ;WITH cte AS 
    (
    SELECT id,
           rn=ROW_NUMBER()OVER(PARTITION BY 生产产品,生产工人 ORDER BY 生产日期),
           生产产品,
           生产日期,
           生产班次
    FROM @galenkeny
    )
    SELECT  * FROM cte WHERE rn='1'
    *******************************************************
    3 1 螺母 2014-06-15 00:00:00.000 晚班  <-- id=6的螺丝钉记录,它的上一个班次   
    2 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=4的螺丝钉记录,它的上一个班次
    1 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=5的螺丝钉记录,它的上一个班次
    *******************************************************
      

  8.   

    declare @galenkeny table(id int,生产产品 varchar(20),生产日期 datetime, 生产班次 varchar(20),生产工人 varchar(20), 生产单号 varchar(20))
    insert into @galenkenyselect'1', '螺丝钉', ' 2014-6-15','早班',' 张三','111' union all
    select'2', '螺丝钉', ' 2014-6-15','早班',' 李四','111' union all
    select'3', '螺母',   ' 2014-6-15','晚班',' 王五','112' union ALL
    select'4', '螺丝钉', ' 2014-6-16','早班',' 李四','111' union ALL
    select'5', '螺丝钉', ' 2014-6-16','早班',' 张三','111' union ALL
    select'6', '螺母',   ' 2014-6-16','早班',' 王五','112' ;WITH cte AS 
    (
    SELECT id,
           rn=ROW_NUMBER()OVER(PARTITION BY 生产产品,生产工人 ORDER BY 生产日期),
           生产产品,
           生产日期,
           生产班次
    FROM @galenkeny
    )
    SELECT  * FROM cte WHERE rn='1'
    *******************************************************
    3 1 螺母 2014-06-15 00:00:00.000 晚班  <-- id=6的螺丝钉记录,它的上一个班次   
    2 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=4的螺丝钉记录,它的上一个班次
    1 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=5的螺丝钉记录,它的上一个班次
    *******************************************************这样?
      

  9.   


    declare @galenkeny table(id int,生产产品 varchar(20),生产日期 datetime, 生产班次 varchar(20),生产工人 varchar(20), 生产单号 varchar(20))
    insert into @galenkenyselect'1', '螺丝钉', ' 2014-6-15','早班',' 张三','111' union all
    select'2', '螺丝钉', ' 2014-6-15','早班',' 李四','111' union all
    select'3', '螺母',   ' 2014-6-15','晚班',' 王五','112' union ALL
    select'4', '螺丝钉', ' 2014-6-16','早班',' 李四','111' union ALL
    select'5', '螺丝钉', ' 2014-6-16','早班',' 张三','111' union ALL
    select'6', '螺母',   ' 2014-6-16','早班',' 王五','112' ;WITH cte AS 
    (
    SELECT id,
           rn=ROW_NUMBER()OVER(PARTITION BY 生产产品,生产工人 ORDER BY 生产日期),
           生产产品,
           生产日期,
           生产班次
    FROM @galenkeny
    )
    SELECT  * FROM cte WHERE rn='1'
    *******************************************************
    3 1 螺母 2014-06-15 00:00:00.000 晚班  <-- id=6的螺丝钉记录,它的上一个班次   
    2 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=4的螺丝钉记录,它的上一个班次
    1 1 螺丝钉 2014-06-15 00:00:00.000 早班  <-- id=5的螺丝钉记录,它的上一个班次
    *******************************************************可否用一条sql语句写出了?
      

  10.   

    这就是一句sql,哪里还来的第二句,上面那些不过是插入点测试数据而已