Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何划分以传播值?_Sql Server_Row Number_Data Partitioning - Fatal编程技术网

Sql server 如何划分以传播值?

Sql server 如何划分以传播值?,sql-server,row-number,data-partitioning,Sql Server,Row Number,Data Partitioning,我有一个数据表: 客户 序列 身份证 许多其他列(不重要) 样本数据: Sequence ID ----------- 214906 2613 214906 2614 214906 2615 214907 2613 214907 2614 214907 2615 214908 2613 214908 2614 214908 2615 214000 2613 213004 4444 111111 5555 111111 5556 111112 5556 111112 5555 我怎样才能得

我有一个数据表:

客户
  • 序列
  • 身份证
  • 许多其他列(不重要)
样本数据:

Sequence ID
-----------
214906 2613
214906 2614
214906 2615
214907 2613
214907 2614
214907 2615
214908 2613
214908 2614
214908 2615
214000 2613
213004 4444
111111 5555
111111 5556
111112 5556 
111112 5555
我怎样才能得到下面想要的结果

214906 2613
214907 2614
214908 2615
214000 2613
213004 4444
111111 5555
111112 5556

我用
ROW_NUMBER()(按顺序划分)
尝试了各种方法,但都没有用,因为我需要在第一组中取第1行,在第二组中取第2行,等等。换句话说,我需要以某种方式将这些序列分散到ID上。我也不能按ID进行分区,因为它们可能会在表中出现多次

我希望我能正确理解您的意思。我使用每个序列的ID计数作为组因子(使用
SUM()
OVER
子句,不使用
ORDER BY
),并在适当的排序和行编号之后:

输入:

CREATE TABLE #Data (
    Sequence int,
    ID int
)
INSERT INTO #Data 
    (Sequence, ID)
VALUES
    (214906, 2613),
    (214906, 2614),
    (214906, 2615),
    (214907, 2613),
    (214907, 2614),
    (214907, 2615),
    (214908, 2613),
    (214908, 2614),
    (214908, 2615),
    (214000, 2613),
    (213004, 4444),
    (111111, 5555),
    (111111, 5556),
    (111112, 5556), 
    (111112, 5555)
T-SQL:

;WITH SequenceCTE AS (
    SELECT 
        *,
        COUNT(*) OVER (PARTITION BY Sequence) AS SequenceCnt
    FROM #Data
), RankCTE AS (
    SELECT 
        *,
        DENSE_RANK() OVER (PARTITION BY SequenceCnt, Sequence ORDER BY SequenceCnt, ID) AS RankNo,
        ROW_NUMBER() OVER (PARTITION BY SequenceCnt, ID ORDER BY Sequence, ID) AS RowNo
    FROM SequenceCTE 
)
SELECT Sequence, ID
FROM RankCTE
WHERE RankNo = RowNo
输出:

----------------
Sequence    ID
----------------
214000      2613
213004      4444
111111      5555
111112      5556
214906      2613
214907      2614
214908      2615
更新(序列中有一个ID的特殊情况):


例如,当组
7
只有
3
ID时,逻辑是什么?谢谢。@Zhorov如果一个序列有3个ID,这意味着还有两个序列有相同的3个ID。如果一个序列有两个ID,那么将有一个序列具有相同的两个ID。所以他们有点分组。214000 2613背后的逻辑是什么?发生翻滚时会发生什么情况?从你的问题来看,这并不清楚。不,这不太容易理解。我在这里看到了大量未解决的边缘案例。也许最好的办法是修复您的数据模型。@Evgeny我很高兴您找到了解决方案。我已经做了一个更新,这几乎是一样的。您可以查看更新的答案。谢谢。
;WITH SequenceCTE AS (
    SELECT 
        *,
        COUNT(*) OVER (PARTITION BY Sequence) AS SequenceCnt
    FROM #Data
), RankCTE AS (
    SELECT 
        *,
        CASE 
            WHEN SequenceCnt = 1 THEN 1
            ELSE DENSE_RANK() OVER (PARTITION BY SequenceCnt, Sequence ORDER BY SequenceCnt, ID) 
        END AS RankNo,
        CASE 
            WHEN SequenceCnt = 1 THEN 1
            ELSE ROW_NUMBER() OVER (PARTITION BY SequenceCnt, ID ORDER BY Sequence, ID) 
        END AS RowNo
    FROM SequenceCTE 
)
SELECT Sequence, ID
FROM RankCTE
WHERE RankNo = RowNo