Sql 对于具有顺序id但不连续id的表中等分的段,如何获取id的最小值/最大值
假设我有一个包含10m行的表。 我想把这个除以6 然后得到一个“段”的列的最小值和最大值(在本例中特别是Id),然后用这样的方式表示它Sql 对于具有顺序id但不连续id的表中等分的段,如何获取id的最小值/最大值,sql,sql-server,Sql,Sql Server,假设我有一个包含10m行的表。 我想把这个除以6 然后得到一个“段”的列的最小值和最大值(在本例中特别是Id),然后用这样的方式表示它 segment1 start: 1 segment1 finish: 10 segment2 start: 100001 segment2 finish: 2000000 ..... segment6 start: 9000001 segment6 end: 10000000 使用MSSQL 我不需要格式化,我只需要数字 因为我看不到分段是预定义的,所以
segment1 start: 1
segment1 finish: 10
segment2 start: 100001
segment2 finish: 2000000
.....
segment6 start: 9000001
segment6 end: 10000000
使用MSSQL
我不需要格式化,我只需要数字 因为我看不到分段是预定义的,所以这可能是一个解决方案。希望你能用这个做点什么
DECLARE @T TABLE (Number INT)
DECLARE @I INT
SET @I = 1
WHILE @I <= 100000
BEGIN
INSERT INTO @T VALUES(@I)
SET @I = @I + 1
END
SELECT 'Segment: ' + CAST(Segment AS VARCHAR(5)) AS Segment,
MIN(Number) AS StartSegment, MAX(Number) AS EndSegment
FROM (SELECT t.Number, NTILE(6) OVER (ORDER BY t.Number) AS Segment
FROM @T AS t) AS a
GROUP BY a.Segment
因为我看不到这些段是预定义的,所以这可能是一个解决方案。希望你能用这个做点什么
DECLARE @T TABLE (Number INT)
DECLARE @I INT
SET @I = 1
WHILE @I <= 100000
BEGIN
INSERT INTO @T VALUES(@I)
SET @I = @I + 1
END
SELECT 'Segment: ' + CAST(Segment AS VARCHAR(5)) AS Segment,
MIN(Number) AS StartSegment, MAX(Number) AS EndSegment
FROM (SELECT t.Number, NTILE(6) OVER (ORDER BY t.Number) AS Segment
FROM @T AS t) AS a
GROUP BY a.Segment
您正在使用哪些RDBMS添加一些示例表数据和预期结果,以及格式良好的文本。同时显示您当前的查询尝试。@jarlh-我没有查询尝试。我有一个想法。您使用哪些RDBMS添加一些示例表数据和预期结果-以及格式良好的文本。同时显示您当前的查询尝试。@jarlh-我没有查询尝试。我有个主意。哇!现在向上看!现在向上看
WITH t (id) AS (
SELECT 1
UNION ALL SELECT 10
UNION ALL SELECT 100001
UNION ALL SELECT 2000000
UNION ALL SELECT 3000000
UNION ALL SELECT 4000000
UNION ALL SELECT 5000000
UNION ALL SELECT 6000000
UNION ALL SELECT 7000000
UNION ALL SELECT 8000000
UNION ALL SELECT 9000001
UNION ALL SELECT 10000000
), rn AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) As _rn
FROM t
), mx ( _rn, /* number of chunks to split into */ _tgt) AS (
SELECT MAX(_rn), CASE WHEN MAX(_rn) < 6 THEN MAX(_rn) ELSE 6 END
FROM rn
), s ( _i, _from, _to) AS (
SELECT 2, CAST(1 As bigint), (SELECT _rn / _tgt FROM mx)
UNION ALL
SELECT _i + 1, _to + 1, (SELECT _rn * _i / _tgt FROM mx)
FROM s WHERE _to < (SELECT _rn FROM mx)
)
SELECT
_i - 1 As [segment],
(SELECT id FROM rn WHERE _rn = _from) As [start],
(SELECT id FROM rn WHERE _rn = _to ) As [finish]
FROM s
WITH t (id) AS (
SELECT 1
UNION ALL SELECT 10
UNION ALL SELECT 100001
UNION ALL SELECT 2000000
UNION ALL SELECT 3000000
UNION ALL SELECT 4000000
UNION ALL SELECT 5000000
UNION ALL SELECT 6000000
UNION ALL SELECT 7000000
UNION ALL SELECT 8000000
UNION ALL SELECT 9000001
UNION ALL SELECT 10000000
), c AS (
SELECT *, NTILE(6) OVER(ORDER BY id) AS segment
FROM t
)
SELECT segment,
MIN(id) As [start],
MAX(id) As [finish]
FROM c
GROUP BY segment