当前位置:编程学习 > C#/ASP.NET >>

谁知道这个sql语句该怎么写??困惑我几天了!

1.数据库中a表有4个字段,ID, 日期(rq),产量(cl),不良数(bls)
2.现在要查询“不良数”字段连续为0的最长的天数以及它的启始时间,终止时间(字段 不良数为0则表示当天无不良)
3.日期不是连续的。
例如:
表a
ID    rq            cl     bls
1    2013.05.01     200    1
2    2013.05.02     200    0
3    2013.05.03     200    3
4    2013.05.06     200    2
5    2013.05.07     200    0
6    2013.05.08     200    0
7    2013.05.10     200    0
8    2013.05.11     200    1 

如上表中字段bls连续为0的最长的天数是3(即ID为5,6,7的三天)
最终结果应该是
开始时间       终止时间      天数
2013.05.07   2013.05.10   3
谢谢啦! --------------------编程问答-------------------- 没戏,只能遍历一遍挨个判断了!

建议你再建个表B,字段包括ID、开始时间、终止时间、天数,在往表A里面插入数据的时候先判断一下是不是连续为0,是的话就更新表B的终止时间和天数,不是的话就同时 在表B里创建个新纪录。 --------------------编程问答--------------------


--插入test_A表
select row_number() over (order by uploadtime) as aID,
uploadtime, measurementVal  into Test_A from 
(
select a.* 
from 
(
select uploadtime,
        Cast(measurementVal as numeric(18,4)) as measurementVal
from T_011001_0001
)  a

)
b
order by uploadtime


--插入test_B表
select row_number() over (order by uploadtime) as aID,
uploadtime, measurementVal  into Test_B from 
(
select '1980-01-01' as uploadtime ,0 measurementVal
union
select a.* 
from 
(
select uploadtime,
        Cast(measurementVal as numeric(18,4)) as measurementVal
from T_011001_0001
)  a

)
b
order by uploadtime




order by uploadtime
Create View Test_V_A
as
select * from  
(
select Test_A.aid ,Test_B.uploadTime,
test_A.measurementVal as measurementVal_P,
test_B.measurementVal as measurementVal_T
 from Test_A 
inner join 
 Test_B 
on  Test_A.aid=Test_B.aid)


select * from Test_V_A 

--where measurementVal_P-measurementVal_T<0
order by Test_A.aid 


这个脚本 是以前别人给我写的  名字叫相邻2行之差计算脚本

不知道对你有没有帮助.感觉跟你的意思差不多 你看下 --------------------编程问答-------------------- 两种方式 可以在sql里遍历判断 也可以查询出来在代码里判断, 不知有没有更简单的方法 --------------------编程问答-------------------- --------------------编程问答-------------------- 我没有想到什么好方法用的是递归

IF OBJECT_ID('T_CSDN_ONE') IS NOT NULL
BEGIN
DROP TABLE T_CSDN_ONE;
END
GO
CREATE TABLE T_CSDN_ONE
(
   ID INT PRIMARY KEY,
   RQ VARCHAR(12),
   CL INT,
   BLS INT
)

INSERT INTO T_CSDN_ONE
SELECT 1,'2013.05.01',200,1
UNION ALL
SELECT 2,'2013.05.02',200,0
UNION ALL
SELECT 3,'2013.05.03',200,3
UNION ALL
SELECT 4,'2013.05.06',200,2
UNION ALL
SELECT 5,'2013.05.07',200,0
UNION ALL
SELECT 6,'2013.05.08',200,0
UNION ALL
SELECT 7,'2013.05.10',200,0
UNION ALL
SELECT 8,'2013.05.11',200,1 


ALTER FUNCTION dbo.F_MAXParentId(@ID INT)
RETURNS INT
AS
BEGIN
DECLARE @PARENTID INT
SET @PARENTID=-1;
    SELECT @PARENTID=ISNULL(PARENTID,-1) FROM (
        SELECT AA.ID,BB.ID AS PARENTID,AA.RQ,BB.RQ AS ENDRQ  FROM T_CSDN_ONE AA LEFT JOIN T_CSDN_ONE BB 
ON AA.ID<>BB.ID AND BB.BLS=0 AND AA.ID<BB.ID 
WHERE AA.BLS=0 AND BB.ID-AA.ID=1
    ) A WHERE ID=@ID;
    WHILE @PARENTID<>-1
    BEGIN
       RETURN DBO.F_MAXParentId(@PARENTID);
    END
    RETURN @ID;
END


SELECT B.PARENTID-A.ID+1,A.RQ,B.ENDRQ FROM T_CSDN_ONE A CROSS JOIN (
SELECT AA.ID,BB.ID AS PARENTID,AA.RQ,BB.RQ AS ENDRQ  FROM T_CSDN_ONE AA LEFT JOIN T_CSDN_ONE BB 
ON AA.ID<>BB.ID AND BB.BLS=0 AND AA.ID<BB.ID 
WHERE AA.BLS=0 AND BB.ID-AA.ID=1
) B 
WHERE A.BLS=0 AND  DBO.F_MAXParentId(A.ID)=B.PARENTID
AND B.ID-A.ID=1
--------------------编程问答--------------------
引用 4 楼 liuchaolin 的回复:
--------------------编程问答--------------------
引用 4 楼 liuchaolin 的回复:
膜拜中。。。。。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,