【问题标题】:List ranges and the total count based on condition根据条件列出范围和总计数
【发布时间】:2016-12-05 06:23:15
【问题描述】:

表架构

CREATE TABLE [dbo].[TblMaster](
    [SID] [int] IDENTITY(1,1) NOT NULL Primary Key,
    [VID] [int] NOT NULL,
    [CreatedDate] [datetime] default (getdate()) NOT NULL,
    [CharToAdd] [varchar](10) NULL,
    [Start] [int]  NOT NULL,
    [End] [int] NOT NULL
)
GO

CREATE TABLE [dbo].[TblDetails](
    [DetailsID] [int] IDENTITY(1,1) NOT NULL Primary Key,
    [SID] [int] NOT NULL,
    [Sno] [int] NOT NULL,
    [ConcatenatedText] [varchar](20) NOT NULL,
    [isIssued] [bit] default (0) NOT NULL,
    [isUsed] [bit] default (0) NOT NULL
)
GO

样本数据:

Insert into dbo.TblMaster Values (1,default, 'CA', 1, 5)
Insert into dbo.TblMaster Values (1,default, 'PA', 1, 5)
GO
Insert into dbo.TblDetails values(1, 1, 'CA1', 0,0)
Insert into dbo.TblDetails values(1, 2, 'CA2', 0,0)
Insert into dbo.TblDetails values(1, 3, 'CA3', 0,0)
Insert into dbo.TblDetails values(1, 4, 'CA4', 1,0)
Insert into dbo.TblDetails values(1, 5, 'CA5', 0,0)
Insert into dbo.TblDetails values(2, 1, 'PA1', 0,0)
Insert into dbo.TblDetails values(2, 2, 'PA2', 0,0)
Insert into dbo.TblDetails values(2, 3, 'PA3', 1,0)
Insert into dbo.TblDetails values(2, 4, 'PA4', 0,0)
Insert into dbo.TblDetails values(2, 5, 'PA5', 0,0)
Insert into dbo.TblDetails values(3, 1, '1', 0,0)
Insert into dbo.TblDetails values(3, 2, '2', 1,0)
Insert into dbo.TblDetails values(3, 3, '3', 1,0)
Insert into dbo.TblDetails values(3, 4, '4', 0,0)
Insert into dbo.TblDetails values(3, 5, '5', 0,0)
    GO

预期输出:

我目前构建的查询:

Declare @VID INT  = 1

    ;WITH Tmp as
    (
      SELECT 
            TM.CharToAdd as Prefix, 
            sno,
            sno - ROW_NUMBER() OVER(ORDER BY sno) as grp
      FROM dbo.TblDetails TD
      LEFT JOIN dbo.TblMaster TM on TM.[SID] = TD.[SID]             
      WHERE isIssued = 0 and isUsed = 0 
            AND  TM.VID = @VID 
    )
    SELECT  Prefix,
            MIN(sno) as RangeStart,
            MAX(sno) as RangeEnd,
            COUNT(*) as [Count]
    FROM Tmp
    GROUP BY grp, Prefix

在 TblDetails 表中,希望从位列为 0 的所有记录中查找可用值的范围及其总计数。如果位列为 1,则表示它已被使用,因此我试图跳过它并列出其余部分作为可用记录。怀疑我是否很好地解释了问题陈述,因此提供了示例数据和预期输出以便更好地理解。我确实尝试了一些递归函数,但结果与预期的输出不匹配。所以寻求帮助来解决这个问题。

【问题讨论】:

    标签: sql-server-2008-r2 sql-server-2014


    【解决方案1】:

    你们很亲密……

    代码

    Declare @VID INT  = 1
    
    ;with cte as(
        select
            m.CHarToAdd,
            d.sno,
            d.sno - ROW_NUMBER() OVER(partition by m.CharToAdd ORDER BY sno) as grp
        from 
            TblMaster m
            inner join
                TblDetails d on
                d.sid = m.sid
        where
            d.isIssued = 0 and d.isUsed = 0 and m.vid = @VID)
    
    select
        CharToAdd,
        min(sno) as Start,
        max(sno) as [End],
        (max(sno) - min(sno) + 1) as [Count]
    from cte
    group by
        CHarToAdd, grp
    order by
        CHarToAdd
    

    结果

    CharToAdd   Start   End Count
    CA             1    3   3
    CA             5    5   1
    PA             1    2   2
    PA             4    5   2
    

    【讨论】:

    • 感谢您的宝贵时间。
    • @prasanth 没问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多