按记录集的第一个数字进行SQL分组

按记录集的第一个数字进行SQL分组,sql,sql-server,Sql,Sql Server,我需要你在SQL方面的帮助 我在下面有一组成本中心ID的记录。 我想做的是通过插入列来区分类别,从而对它们进行隔离/分组 如您所见,所有以7开头的数字都属于粗体数字。 我预期的结果也在下图中 您可以按以下方式进行操作: DECLARE @Tbl TABLE (ID INT) INSERT INTO @Tbl VALUES (735121201), (735120001), (5442244), (735141094), (735141097), (4008060), (735117603), (

我需要你在SQL方面的帮助 我在下面有一组成本中心ID的记录。 我想做的是通过插入列来区分类别,从而对它们进行隔离/分组

如您所见,所有以7开头的数字都属于粗体数字。 我预期的结果也在下图中

您可以按以下方式进行操作:

DECLARE @Tbl TABLE (ID INT)
INSERT INTO @Tbl
VALUES
(735121201),
(735120001),
(5442244),
(735141094),
(735141097),
(4008060),
(735117603),
(40100000),
(735142902),
(735151199),
(4010070)

;WITH TableWithRowId
AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY(SELECT NULL)) RowId,
        ID
    FROM 
        @Tbl    
), TempTable
AS
(
    SELECT T.RowId + 1 AS RowId  FROM TableWithRowId T
    WHERE
        LEFT(T.ID, 1) != 7
), ResultTable
AS
(
    SELECT
        T.RowId ,
        T.ID,
        DENSE_RANK() OVER (ORDER BY (SELECT TOP 1 A.RowId FROM TempTable A WHERE A.RowId > T.RowId ORDER BY A.RowId)) AS Flag
    FROM TableWithRowId T
)

SELECT * FROM ResultTable
结果:

RowId       ID          Flag
----------- ----------- ----------
1           735121201   1
2           735120001   1
3           5442244     1
4           735141094   2
5           735141097   2
6           4008060     2
7           735117603   3
8           40100000    3
9           735142902   4
10          735151199   4
11          4010070     4

下面的查询与NEER的查询类似

;WITH test_table(CenterID)AS(
    SELECT '735121201' UNION ALL
    SELECT '735120001' UNION ALL
    SELECT '5442244' UNION ALL
    SELECT '735141094' UNION ALL
    SELECT '735141097' UNION ALL
    SELECT '4008060' UNION ALL
    SELECT '735117603' UNION ALL
    SELECT '40100000' UNION ALL
    SELECT '735142902' UNION ALL
    SELECT '735151199' UNION ALL
    SELECT '4010070'
),t1 AS (
    SELECT *,ROW_NUMBER()OVER(ORDER BY(SELECT 1)) AS rn,CASE WHEN LEFT(t.CenterID,1)='7' THEN 1 ELSE 0 END AS isSeven
    FROM test_table AS t
),t2 AS(
    SELECT t1.*,ROW_NUMBER()OVER(ORDER BY t1.rn) AS toFilter
    FROM t1 LEFT JOIN t1 AS pt ON pt.rn=t1.rn-1 
    WHERE pt.CenterID IS NULL OR (t1.isSeven=1 AND pt.isSeven=0)
)
SELECT t1.CenterID,x.toFilter FROM t1
CROSS APPLY(SELECT TOP 1 t2.toFilter FROM t2 WHERE t2.rn<=t1.rn ORDER BY rn desc) x

请阅读并相应地编辑您的问题。是否有任何关于必须设置为特定值的标准ID@JackyMontevirgen堆栈溢出的官方政策是用英语发布问题/答案/评论。我建议你以后用英语发表评论,这样更多的堆栈溢出用户就可以理解了。我不明白你想要什么。花点时间解释一下如何设置这些toFilter值。请记住,行是无序的。请检查我的图像。 CenterID toFilter --------- -------------------- 735121201 1 735120001 1 5442244 1 735141094 2 735141097 2 4008060 2 735117603 3 40100000 3 735142902 4 735151199 4 4010070 4