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) */
谢谢大神,能分开写吗?不用一条sql语句
应该是没办法拆分. 能一条SQL语句解决的问题,为不用一条SQL语句解决呢?
你就用版主这个吧,你上面那个问题,取top 1的时候按照id desc排下序吧
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的值,哪里错了呢
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
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的螺丝钉记录,它的上一个班次 *******************************************************
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的螺丝钉记录,它的上一个班次 *******************************************************这样?
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语句写出了?
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)
*/
谢谢大神,能分开写吗?不用一条sql语句
能一条SQL语句解决的问题,为不用一条SQL语句解决呢?
这样会得到很多111的值,哪里错了呢
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
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的螺丝钉记录,它的上一个班次
*******************************************************
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的螺丝钉记录,它的上一个班次
*******************************************************这样?
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语句写出了?