问题 确定列上使用的MAX十进制比例


在MS SQL中,我需要一种方法来确定某个十进制列的行使用的最大比例。

例如,Col1 Decimal(19,8)的比例为8,但我需要知道是否所有8个实际上都在使用,或者是否只使用了5,6或7。

样本数据:

123.12345000
321.43210000
5255.12340000
5244.12345000

对于上面的数据,我需要查询返回5,或123.12345000或5244.12345000。

我不关心性能,我确定全表扫描会有序,我只需要运行一次查询。


11424
2018-01-23 20:26


起源



答案:


不漂亮,但我认为应该这样做:

-- Find the first non-zero character in the reversed string...
-- And then subtract from the scale of the decimal + 1.
SELECT 9 - PATINDEX('%[1-9]%', REVERSE(Col1))

9
2018-01-23 20:34



不漂亮,但很棒。奇迹般有效。刚添加MAX(),过滤掉0.00000000。添加MAX()给了我:SELECT MAX(9 - PATINDEX('%[1-9]%',REVERSE(Col1))) - Bo Flexson


答案:


不漂亮,但我认为应该这样做:

-- Find the first non-zero character in the reversed string...
-- And then subtract from the scale of the decimal + 1.
SELECT 9 - PATINDEX('%[1-9]%', REVERSE(Col1))

9
2018-01-23 20:34



不漂亮,但很棒。奇迹般有效。刚添加MAX(),过滤掉0.00000000。添加MAX()给了我:SELECT MAX(9 - PATINDEX('%[1-9]%',REVERSE(Col1))) - Bo Flexson


我喜欢 @Michael Fredrickson的回答 更好,我只发布此作为特定情况的替代方案,其中实际规模未知但肯定不超过18:

SELECT LEN(CAST(CAST(REVERSE(Col1) AS float) AS bigint))

请注意,尽管此处有两个显式CAST调用,但查询实际上还执行了两次隐式转换:

  1. 作为REVERSE的论据, Col1 转换为字符串。

  2. bigint 在被用作LEN的参数之前被强制转换为字符串。


6
2018-01-23 21:22



+1不需要知道比例...... - Michael Fredrickson
您帮助找到了解决方案: stackoverflow.com/a/14715318/114029 我不得不走得更远,用这个人的帖子到达那里: connectsql.blogspot.com.br/2011/04/... 有趣的是,如何根据分散的信息来建立解决方案......:D - Leniel Maccaferri


SELECT
    MAX(CHAR_LENGTH(
        SUBSTRING(column_name::text FROM '\.(\d*?)0*$')
    )) AS max_scale
FROM table_name;

*? 是非贪婪的版本 *所以 \d*? 捕获小数点后的所有数字,除了尾随零。

该模式包含一对括号,因此文本中与第一个带括号的子表达式匹配的部分(即 \d*?)被退回。

参考文献:


0
2017-11-22 14:29





请注意,这将扫描整个表:

SELECT TOP 1 [Col1] 
FROM [Table]
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC 

0
2017-12-08 22:38