查找包含分层小数的列的最大值

时间:2017-04-13 06:05:32

标签: sql sql-server

我有一个表格,列值类似于“1.2.4.5”,“3.11.0.6”, '3.9.3.14','1.4.5.6.7',N / A等。我想找到该特定列的最大值。但是,当我使用此查询时,我没有得到最大值。

(SELECT  max (CASE WHEN mycolumn = 'N/A'
        THEN '-1000'
        ELSE mycolumn
        END )
FROM mytable
WHERE column like 'abc') 

我得到3.9.3.14作为最大值而不是3.11 ....

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

那些不是真正的小数 - 它们是包含多个点的字符串,所以将它们视为"小数"它们是无益的。

我们可以通过一些操作来完成您的查询。 SQL Server中有一种类型构建,更自然地代表了这种类型的结构 - hierarchyid。如果我们将您的值转换为此类型,那么我们可以非常轻松地找到u201c/"/g

MAX

结果:

 declare @t table (val varchar(93) not null)
 insert into @t(val) values
 ('1.2.4.5'),
 ('3.11.0.6'),
 ('3.9.3.14'),
 ('1.4.5.6.7')

 select MAX(CONVERT(hierarchyid,'/' + REPLACE(val,'.','/') + '/')).ToString()
 from @t

我将完全将此字符串表示转换回原始形式的练习作为读者练习。或者,我建议您仍然可以使用此数据类型启动存储数据。

答案 1 :(得分:2)

存储为文本的值的

MAX()执行字母排序。 使用FIRST_VALUEHIERARCHYID

SELECT DISTINCT FIRST_VALUE(t.mycolumn) OVER(
                ORDER BY CONVERT(HIERARCHYID, '/' + REPLACE(NULLIF(t.mycolumn,'N/A'), '.', '/') + '/') DESC) AS [Max]
FROM #mytable t