我已经使用Stuff编写了这个查询来生成范围,但是如果同时进入不同范围那么由于进入时间组而存在问题,那么它就找不到范围的最小值
SELECT DISTINCT ST2.Center_Code
,STUFF((
SELECT ' , ' + ST1.Ranges
FROM (
SELECT Center_Code
,CAST(MIN(CONVERT(BIGINT, Starting_No)) AS VARCHAR(9)) + '-' + CAST(MAX(CONVERT(BIGINT, Starting_No)) AS VARCHAR(9)) Ranges
FROM AwardSheet_Record
GROUP BY Center_Code
,LEFT(Despatch_Time, 8)
) ST1
WHERE ST1.Center_Code = ST2.Center_Code
ORDER BY ST1.Center_Code
FOR XML PATH('')
), 1, 2, '') Center_Range
FROM AwardSheet_Record ST2
WHERE ST2.Center_Code IS NOT NULL
表记录就像这样
CenterCode starting time
123 1 2:30
123 2 2:30
123 3 2:30
14 6 2:33
14 7 2:33
14 8 2:33
123 9 2:35
123 10 2:35
14 11 2:38
14 12 2:38
14 13 2:38
要求范围是中心123 1-2,8-10和中心14 6-8,11-13
答案 0 :(得分:0)
我会分阶段进行:
With AwardSheet_Record As (
Select CenterCode, starting, cast(Time as Time) As Time
From (Values
((123 ),(1 ),('2:30')),
((123 ),(2 ),('2:30')),
((123 ),(3 ),('2:30')),
((14 ),(6 ),('2:33')),
((14 ),(7 ),('2:33')),
((14 ),(8 ),('2:33')),
((123 ),(9 ),('2:35')),
((123 ),(10),('2:35')),
((14 ),(11),('2:38')),
((14 ),(12),('2:38')),
((14 ),(13),('2:38'))
) a (CenterCode, starting, Time)
), AwardSheet_Intervals As (
Select CenterCode, Time, Cast(Min(starting) As Varchar) + ' - ' + Cast(Max(starting) As Varchar) As Interval
From AwardSheet_Record
Group By CenterCode, Time
)
Select CenterCode,
STUFF((
Select ', ' + Interval
From AwardSheet_Intervals
Where CenterCode = Ref.CenterCode --< Apply GROUP BY filtering here
Order By Time
For XML PATH (''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '') As [Range] --< XML trick to combine values in a comma-separated string
From AwardSheet_Intervals Ref
Group By CenterCode;
CenterCode Range
---------- --------------
14 6 - 8, 11 - 13
123 1 - 3, 9 - 10