Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 对于具有顺序id但不连续id的表中等分的段,如何获取id的最小值/最大值_Sql_Sql Server - Fatal编程技术网

Sql 对于具有顺序id但不连续id的表中等分的段,如何获取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 我不需要格式化,我只需要数字 因为我看不到分段是预定义的,所以

假设我有一个包含10m行的表。 我想把这个除以6 然后得到一个“段”的列的最小值和最大值(在本例中特别是Id),然后用这样的方式表示它

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