27,581
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
;WITH CTE (AutoId,[订单编号],[不合格],[时间]) AS
(
SELECT 1,'A',1,'2014-11-1' UNION ALL
SELECT 2,'B',1,'2014-11-2' UNION ALL
SELECT 3,'A',1,'2014-11-3' UNION ALL
SELECT 4,'A',1,'2014-11-4' UNION ALL
SELECT 5,'B',1,'2014-11-5' UNION ALL
SELECT 6,'A',1,'2014-11-6' UNION ALL
SELECT 7,'A',0,'2014-11-7' UNION ALL
SELECT 8,'B',1,'2014-11-8' UNION ALL
SELECT 9,'B',1,'2014-11-9' UNION ALL
SELECT 10,'B',1,'2014-11-10' UNION ALL
SELECT 11,'B',0,'2014-11-10'
)
,CTE2 AS(
SELECT [AutoId],
[订单编号] ,
[时间],
ROW_NUMBER() OVER (PARTITION BY [订单编号] ORDER BY [AutoId]) AS [订单序号],
ROW_NUMBER() OVER (PARTITION BY [订单编号] ORDER BY [AutoId]) - ROW_NUMBER() OVER (PARTITION BY [订单编号],[不合格] ORDER BY [AutoId]) AS [连续不合格数]
FROM CTE)
SELECT b.[订单编号],b.[连续不合格数],c.[时间]
FROM (SELECT [订单编号],MAX([连续不合格数]) AS [连续不合格数] FROM CTE2 GROUP BY [订单编号]) a
INNER JOIN CTE2 b ON a.[订单编号] = b.[订单编号] AND a.[连续不合格数] = b.[连续不合格数]
INNER JOIN CTE2 c ON b.[订单编号] = c.[订单编号] AND b.订单序号 = c.订单序号 + 1
--> --> (Roy)生成測試數據
if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([AutoId] int,[台位号] nvarchar(2),[订单号] nvarchar(2),[不合格] int,[日期] Datetime)
Insert #T
select 1,N'T1',N'A1',1,'2014/1/1' union all
select 2,N'T1',N'A1',1,'2014/1/2' union all
select 3,N'T1',N'A1',1,'2014/1/3' union all
select 4,N'T2',N'A1',1,'2014/1/4' union all
select 5,N'T2',N'A1',1,'2014/1/5' union all
select 6,N'T3',N'A1',1,'2014/1/6' union all
select 7,N'T3',N'A1',1,'2014/1/7' union all
select 8,N'T3',N'A1',1,'2014/1/8' union all
select 9,N'T1',N'A1',0,'2014/1/9' union all
select 10,N'T1',N'A1',1,'2014/1/10' union all
select 11,N'T2',N'A1',0,'2014/1/11' union all
select 12,N'T2',N'A1',1,'2014/1/12' union all
select 13,N'T3',N'A1',1,'2014/1/13' union all
select 14,N'T3',N'A1',1,'2014/1/14'
Go
--[AutoId]有断号时需要重新生成序号
Select *
,ID=IDENTITY(INT,1,1)
,ID2=(SELECT COUNT(1) FROM #T WHERE [台位号]=a.[台位号] AND [订单号]=a.[订单号] AND [不合格]=a.[不合格] AND [AutoId]<=a.[AutoId] )
INTO #1
from #T AS a
ORDER BY [台位号],[订单号],[AutoId]
SELECT [台位号],[订单号],ID-ID2 AS Grp,count(1) as Con,max([日期]) as [日期] INTO #2 FROM #1 where [不合格]=1 GROUP BY [台位号],[订单号],ID-ID2
select
[台位号],[订单号] ,[Con] as [不合格],[日期]
from #2 as a
where not exists(select 1 from #2 where [台位号]=a.[台位号] and [订单号]=a.[订单号] and Con>a.Con)
/*
台位号 订单号 不合格 日期
T1 A1 3 2014-01-03 00:00:00.000
T2 A1 2 2014-01-05 00:00:00.000
T3 A1 5 2014-01-14 00:00:00.000
*/--> --> (Roy)生成測試數據
if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([AutoId] int,[台位号] nvarchar(2),[订单号] nvarchar(2),[不合格] int,[日期] Datetime)
Insert #T
select 1,N'T1',N'A1',1,'2014/1/1' union all
select 2,N'T1',N'A1',1,'2014/1/2' union all
select 3,N'T1',N'A1',1,'2014/1/3' union all
select 4,N'T2',N'A1',1,'2014/1/4' union all
select 5,N'T2',N'A1',1,'2014/1/5' union all
select 6,N'T3',N'A1',1,'2014/1/6' union all
select 7,N'T3',N'A1',1,'2014/1/7' union all
select 8,N'T3',N'A1',1,'2014/1/8' union all
select 9,N'T1',N'A1',0,'2014/1/9' union all
select 10,N'T1',N'A1',1,'2014/1/10' union all
select 11,N'T2',N'A1',0,'2014/1/11' union all
select 12,N'T2',N'A1',1,'2014/1/12' union all
select 13,N'T3',N'A1',1,'2014/1/13' union all
select 14,N'T3',N'A1',1,'2014/1/14'
Go
;with T1
as
(
select*
from (
Select *
,row_number()over(order by [台位号],[订单号],[AutoId])-row_number()over(order by [台位号],[订单号],[不合格],[AutoId]) as grp from #T) as a
),T2
as
(
select [台位号],[订单号],grp,count(1) as Con,max([日期]) as [日期] from T1 where [不合格]=1 group by [台位号],[订单号],grp
)
select
[台位号],[订单号] ,[Con] as [不合格],[日期]
from T2 as a
where not exists(select 1 from T2 where [台位号]=a.[台位号] and [订单号]=a.[订单号] and Con>a.Con)
/*
台位号 订单号 不合格 日期
T1 A1 3 2014-01-03 00:00:00.000
T2 A1 2 2014-01-05 00:00:00.000
T3 A1 5 2014-01-14 00:00:00.000
*/
create table test (autoid int,订单编号 varchar(2),不合格 int ,时间 date)
insert into test values
(1,'a',1,'2014-11-1'),
(2,'b',1,'2014-11-2'),
(3,'a',1,'2014-11-3'),
(4,'a',1,'2014-11-4'),
(5,'b',1,'2014-11-5'),
(6,'a',1,'2014-11-6'),
(7,'a',0,'2014-11-7'),
(8,'b',1,'2014-11-8'),
(9,'b',1,'2014-11-9'),
(10,'b',1,'2014-11-10')
with cte as
(select * ,1 as groupid from test where autoid=1
union all
select b.*,case when a.不合格=b.不合格 then a.groupid else a.groupid+1 end as groupid
from cte as a join test as b on a.autoid=b.autoid-1)
select 订单编号,sums,时间 from ( select *,ROW_NUMBER()over(partition by 订单编号 order by sums desc ) as rn from
(select 订单编号,count(订单编号) as sums,max(时间) as 时间 from cte
where 不合格=1
group by groupid ,订单编号) as a ) as a
where rn =1
--结果
订单编号 sums 时间
---- ----------- ----------
a 4 2014-11-06
b 3 2014-11-10
(2 行受影响)
select 订单编号,SUM(case 不合格 when 1 then 1 else 0 end) from 订单表 group by 订单编号WITH table1(AutoId,订单编号,不合格,时间) AS (
SELECT 1,'A',1,'2014-11-01' UNION ALL
SELECT 2,'B',1,'2014-11-02' UNION ALL
SELECT 3,'A',1,'2014-11-03' UNION ALL
SELECT 4,'A',1,'2014-11-04' UNION ALL
SELECT 5,'B',1,'2014-11-05' UNION ALL
SELECT 6,'A',1,'2014-11-06' UNION ALL
SELECT 7,'A',0,'2014-11-07' UNION ALL
SELECT 8,'B',1,'2014-11-08' UNION ALL
SELECT 9,'B',1,'2014-11-09' UNION ALL
SELECT 10,'B',1,'2014-11-10'
)
,t1 AS(
SELECT *
,ROW_NUMBER()OVER(PARTITION BY 订单编号 ORDER BY 时间) rn1
,ROW_NUMBER()OVER(PARTITION BY 订单编号,不合格 ORDER BY 时间) rn2
FROM table1
)
,t2 AS (
SELECT 订单编号,
COUNT(*)不合格,
MAX(时间)时间,
RANK() OVER(PARTITION BY 订单编号 ORDER BY COUNT(*),MAX(时间) DESC) rk
FROM t1
WHERE 不合格=1
GROUP BY 订单编号,rn1-rn2
)
SELECT *
FROM t2
WHERE rk = 1订单编号 不合格 时间 rk
-------- ----------- ---------- --------------------
A 4 2014-11-06 1
B 5 2014-11-10 1select count(*),max(时间) from A where 不合格<>'0'
group by 订单编号--SQL Server 2000
-- 测试数据
SELECT *
INTO #table1
FROM (
SELECT 1 AutoId,'A' 订单编号,1 不合格,'2014-11-01' 时间 UNION ALL
SELECT 2,'B',1,'2014-11-02' UNION ALL
SELECT 3,'A',1,'2014-11-03' UNION ALL
SELECT 4,'A',1,'2014-11-04' UNION ALL
SELECT 5,'B',1,'2014-11-05' UNION ALL
SELECT 6,'A',1,'2014-11-06' UNION ALL
SELECT 7,'A',0,'2014-11-07' UNION ALL
SELECT 8,'B',1,'2014-11-08' UNION ALL
SELECT 9,'B',1,'2014-11-09' UNION ALL
SELECT 10,'B',1,'2014-11-10'
) t
GO
-- 求分段范围
SELECT t1.订单编号,
t1.时间,
MAX(t0.时间) 时间0,
MIN(t2.时间) 时间2
INTO #table2
FROM #table1 t1
LEFT JOIN #table1 t0
ON t0.订单编号 = t1.订单编号
AND t0.不合格 = 0
AND t0.时间 < t1.时间
LEFT JOIN #table1 t2
ON t2.订单编号 = t1.订单编号
AND t2.不合格 = 0
AND t2.时间 > t1.时间
WHERE t1.不合格 = 1
GROUP BY t1.订单编号, t1.时间
ORDER BY t1.订单编号, t1.时间
--SELECT * FROM #table2
-- 分段统计
SELECT 订单编号,
COUNT(*) 不合格,
MAX(时间)时间
INTO #table3
FROM #table2
GROUP BY 订单编号,时间0,时间2
--SELECT * FROM #table3
-- 对应多个分段都是最大的不合格次数,求时间最大的分段
SELECT t.订单编号,
t.不合格,
MAX(t.时间) 时间
FROM #table3 t
JOIN ( SELECT 订单编号,
MAX(不合格) 不合格
FROM #table3
GROUP BY 订单编号
) tm
ON tm.订单编号 = t.订单编号
AND tm.不合格 = t.不合格
GROUP BY t.订单编号, t.不合格
select bianhao as "订单编号",count(hege) as "不合格"
from Test1
group by bianhao;;WITH CTE AS(
SELECT *
,ROW_NUMBER()OVER(ORDER BY 时间)RN
,ROW_NUMBER()OVER(PARTITION BY 不合格 ORDER BY 时间)RN1
FROM TB
)
,CTE2 AS(
SELECT 订单编号,不合格,COUNT(1)不合格数,MAX(时间)时间
,ROW_NUMBER()OVER(PARTITION BY 订单编号 ORDER BY COUNT(1) DESC)RN3
FROM CTE
GROUP BY 订单编号,不合格,RN-RN1
)
SELECT 订单编号,不合格数 不合格,时间
FROM CTE2
WHERE 不合格=1 AND RN3=1大概猜了一下,不知道是不是这样