通过记录计数将儿童记录分为簇,而不会使父级ID分开



我正在尝试构建一个过程,将一组交易分为大小相等的组以促进数据。

一个实体可以具有多个交易。为了这个问题,假设交易可以具有与之相关的多个数量。这是胡说八道,但它使所有数字都保持不变。

我想将总交易分为群集,但我不能划分一个实体。所有实体的交易都需要一起处理。

这是一个示例数据集:

CREATE TABLE #sorting
(
 Entity_ID bigint
,Trans_ID bigint
,Trans_Amt money
);
INSERT #sorting
(
 Entity_ID 
,Trans_ID 
,Trans_Amt 
)
VALUES
  (321, 456, 1.00),
  (321, 457, 2.00),
  (5309, 458, 10.00),
  (321, 459, 1.50),
  (5309, 460, 2.50),
  (321, 461, 10.50),
  (5309, 462, 3.00),
  (321, 463, 4.00),
  (321, 465, 6.00),
  (867, 466, 7.00),
  (321, 467, 9.00),
  (867, 466, 22.00),
  (321, 468, 4.20)
SELECT
  Entity_ID
  ,COUNT(*) AS RecCnt
FROM #sorting
GROUP BY Entity_ID;
SELECT 
  *
FROM #sorting
ORDER BY 
 Entity_ID 
,Trans_ID 
,Trans_Amt DESC;

IF OBJECT_ID('tempdb..#sorting', 'U') IS NOT NULL
  DROP TABLE #sorting;

第一个查询的结果集如下所示:

Entity_ID   RecCnt
  321         8
  867         2
 5309         3

我的梦想结果集看起来像这样(它不需要记录计数,只是ENTITY_ID和组成员资格。以下说明包括记录计数(:

Entity_ID   RecCnt  Group_ID
  321         8         1
  867         2         2
 5309         3         2

entity_id 321本身位于一个组中,因为它包含超过一半的交易。Entity_IDS 867和5309聚集在一起,因为它们的总交易或多或少等于321中的总数。

在现实生活中,我将几百万笔交易分为8或10个集群。

我尝试了Ntile((和一些失败的子查询的不同排列,但我认为我已经变得太深了。如果有人可以伸出援手,我会很感激。

编辑:20180223-将目标从并行处理更改为数据块。

这个问题看起来与此相似
分为5组的值组应具有总和(计数(均匀

我根据您的问题从这个问题中更改了答案。

DECLARE @GroupCount INT = 2
;WITH Data AS (
    SELECT
      Entity_ID
      ,COUNT(*) AS RecCnt
    FROM #sorting
    GROUP BY Entity_ID
),
CTE AS (
    SELECT * ,
        RN = ROW_NUMBER() OVER (ORDER BY RecCnt DESC)
    FROM Data
)
,CTE2 AS (
    SELECT *, 
        RN2 = ROW_NUMBER() OVER(ORDER BY CEILING( RN / @GroupCount * 1.0 ), (( 1 - CEILING( RN / @GroupCount * 1.0 )) * RecCnt ) DESC ) 
    FROM CTE 
)
SELECT 
    CTE2.Entity_ID, 
    CTE2.RecCnt, 
    ((RN2+1) % @GroupCount) +1 GroupIndex, 
    SUM(CTE2.RecCnt) OVER (PARTITION BY ((RN2+1) % @GroupCount)) CmlTotal 
FROM CTE2

最新更新