将数据行分组为1000

时间:2017-11-22 09:01:29

标签: python sql python-3.x sql-server-2014

我想生成一个post_no列并将我的数据拆分成组,这样每1000个帖子就可以分组。

例如,如果我在区域A中有3222个帖子,在区域B中有4174个帖子,我希望将这些帖子分组为1000个,如下所示:

post_no      id  region amount 
0001 - 1000  1    A      1000
1001 - 2000  2    A      1000
2001 - 3000  3    A      1000
3001 - 3222  4    A       222
0001 - 1000  5    B      1000
1001 - 2000  6    B      1000
2001 - 3000  7    B      1000
3001 - 4000  8    B      1000
4001 - 4174  9    B       174

我更喜欢使用sql或python代码来实现它。

1 个答案:

答案 0 :(得分:2)

<强>更新

我刚刚重新阅读了这个问题,这个问题仍然没有多大意义,但我得出的结论是,我没有回答这里提出的问题,但我会暂时留下这个问题。如果它以某种小的方式帮助OP。

所以我想我想出了你在寻找什么。我通过稍微改变您的数据制作了一份工作样本。因此,您的post_no值看起来像这样:110001~111000我已将我的示例修改为1000,因为您没有解释为什么这些值显示为这个以及我们如何使用它们。

此示例为您提供基本操作,以根据值是否可被1000整除来获取所需的amount值。

<强>参考:

% (Modulus) (Transact-SQL)

  

返回一个数字的余数除以另一个数字。

<强>示例

CREATE TABLE #temp
( post_no INT, id INT, region NVARCHAR(1));

INSERT INTO #temp
( post_no, id, region)
VALUES
(1000, 1, 'A'),
(2000, 2, 'A'),
(3000, 3, 'A'),
(3222, 4, 'A'),
(1000, 5, 'B'),
(2000, 6, 'B'),
(3000, 7, 'B'),
(4000, 8, 'B'),
(4174, 9, 'B');

SELECT t.post_no,
       t.id,
       t.region,
       CASE WHEN t.post_no % 1000 = 0 
            THEN post_no / ROW_NUMBER() OVER (PARTITION BY t.region ORDER BY id) 
            ELSE t.post_no % 1000 
            END AS amount      
FROM #temp AS t;

DROP TABLE #temp;

<强>结果:

post_no     id          region amount
----------- ----------- ------ --------------------
1000        1           A      1000
2000        2           A      1000
3000        3           A      1000
3222        4           A      222
1000        5           B      1000
2000        6           B      1000
3000        7           B      1000
4000        8           B      1000
4174        9           B      174

注意:

这可以进一步简化为简单地返回1000,其中数字可被1000整除,但我会将上面的内容保留为安全。替代代码如下所示:

SELECT t.post_no,
       t.id,
       t.region,
       CASE WHEN t.post_no % 1000 = 0 
            THEN 1000 -- just return 1000 if it's divisible by 1000
            ELSE t.post_no % 1000 
            END AS amount      
FROM #temp AS t;