【问题标题】:Is there a way of getting a proportional section of an SQL table?有没有办法获得 SQL 表的比例部分?
【发布时间】:2021-01-23 04:03:43
【问题描述】:

为了便于阅读,我正在尝试将单个查询拆分为 4 个部分。

将其作为单个查询虽然足够,但对于显示目的来说并不“漂亮”。

一个例子是一个类似于下面的查询。

SELECT Column1Number
      ,Column2Text
FROM TableExample
WHERE Column1Number BETWEEN 1 AND 100
Column1Number Column2Text
001 Desc1
... ...
100 Desc100

我希望它能够带来的是上述内容,但分成 4(或 X)等份。

Column1Number Column2Text
001 Desc1
... ...
25 Desc25
Column1Number Column2Text
26 Desc26
... ...
50 Desc50
Column1Number Column2Text
51 Desc51
... ...
75 Desc75
Column1Number Column2Text
76 Desc76
... ...
100 Desc100

然后可以将上述 4 个表格水平并排显示。

WHERE 子句上会有“其他”过滤器,但它会生成一个数字列表及其对应的文本。以产品编号和产品描述为例。

我认为我需要一种将MAX(Column1Number) 除以 4 并将结果放入变量的方法。也许是这样的。

DECLARE @MinNumber VARCHAR(100) = MIN(Column1Number)
DECLARE @MaxNumber VARCHAR(100) = MAX(Column1Number)
DECLARE @QuarterMaxNumber VARCHAR(100) = @MaxNumber/4

从那里,我应该能够对变量进行“四分之一”处理

DECLARE @FirstQuarter VARCHAR(100) = @MinNumber + @QuarterMaxNumber
DECLARE @ThirdQuarter VARCHAR(100) = @MaxNumber - @QuarterMaxNumber
DECLARE @MidWayPoint VARCHAR(100) = @MaxNumber/2

最后对4条SQL查询做一些比较简单的调整。

SELECT Column1Number
      ,Column2Text
FROM TableExample
WHERE Column1Number >= @MinNumber AND Column1Number < @FirstQuarter
SELECT Column1Number
      ,Column2Text
FROM TableExample
WHERE Column1Number >= @FirstQuarter AND Column1Number < @MidWayPoint
SELECT Column1Number
      ,Column2Text
FROM TableExample
WHERE Column1Number >= @MidWayPoint AND Column1Number < @ThirdQuarter
SELECT Column1Number
      ,Column2Text
FROM TableExample
WHERE Column1Number >= @ThirdQuarter AND Column1Number <= @MaxNumber

我认为以上内容适用于连续数字。即从 1 到 100 的连续计数,但如果缺少某些数字,或者列表不是从 1 开始,则会中断。中断是指 4 个查询的长度不相等。

我将能够在 4 个单独的查询中拥有相同的变量集,并且自定义设置 WHERE 子句也不是问题。它可能效率不高,但目前这不是什么大问题。

最后。我希望这有一些技巧。

感谢所有帮助。

【问题讨论】:

  • 也许 ntile 可能适用于此。
  • 这可能是你需要的:stackoverflow.com/questions/2776006/…
  • 这应该在你的前端处理。但是如果你决定用 SQL 来做,看看offset
  • 我认为这将处理不均匀大小的桶。抱歉没有第一次阅读。 stackoverflow.com/questions/52831510/…
  • row_Number 可用于生成您自己的 Id 字段,因此您不必像上面提到的那样处理空白

标签: sql tsql


【解决方案1】:

为此,您可以使用NTILE。 NTILE 是 T-SQL 划分行的方式尽可能均匀

--==== 1. Sample Data
DECLARE @table TABLE (SomeNbr INT IDENTITY, SomeValue VARCHAR(50));
INSERT @table(SomeValue) SELECT TOP (11) NEWID() FROM sys.all_columns;

--==== Solution
SELECT 
  TileGroup = NTILE(4) OVER (ORDER BY t.SomeNbr), t.SomeNbr, t.SomeValue 
FROM   @table AS t;

返回:

TileGroup   SomeNbr  SomeValue
----------- -------- ---------------
1           1        C3DB121B-C353-4...
1           2        A6C40211-D53B-4...
1           3        A2089286-1106-4...
2           4        3392E634-1D5E-4...
2           5        9006F0EB-1FDB-4...
2           6        831175BF-2783-4...
3           7        339216A6-AB6C-4...
3           8        29EAEECA-27E9-4...
3           9        CA302532-40F1-4...
4           10       29A41096-A786-4...
4           11       E0CA6CD4-FCB4-4...

请注意,NTILE 的性能并不出色。为了获得更好的性能,您可以使用NTally Table,因为这是均匀划分行的最快方法;性能远超 NTILE。不过还需要做一些工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2013-07-20
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多