我正在尝试构建一个过程,将一组交易分为大小相等的组以促进数据。
一个实体可以具有多个交易。为了这个问题,假设交易可以具有与之相关的多个数量。这是胡说八道,但它使所有数字都保持不变。
我想将总交易分为群集,但我不能划分一个实体。所有实体的交易都需要一起处理。
这是一个示例数据集:
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