【问题标题】:How to sort a column based on length of data in it in SQL server如何根据 SQL Server 中的数据长度对列进行排序
【发布时间】:2014-09-02 17:08:18
【问题描述】:

众所周知,一般排序是使用 order by。我想要执行的类型是不同的。我想要表格中间的最小长度值 n 顶部和底部的最大长度值。一半应该下降,另一半应该上升。你们能帮忙吗。这是一道面试题。

【问题讨论】:

  • 感谢您的意见。请参阅下面的参考:
  • column1 column2 sorted_length(from column2) aa aaaaaaaaa 9 bb bbbbbbbb 8 cc ccccccc 7 dd ddddd 5 ee eeee 4 ff ff 2 gg gggg 4 hh hhhhh 5 ii iiiiii 6 jj jjjjjjj 7 kk kkkkkkkk 8跨度>

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012


【解决方案1】:

这是一种方式:

;WITH CTE AS
(
    SELECT  *, 
            RN = ROW_NUMBER() OVER(ORDER BY LEN(YourColumn))
    FROM dbo.YourTable
)
SELECT *
FROM CTE
ORDER BY RN%2, (CASE WHEN RN%2 = 0 THEN 1 ELSE -1 END)*RN DESC

【讨论】:

  • 第二个标准也可以用一种不太清晰但更简洁的方式重写:(1 - RN % 2 * 2) * RN DESC。
【解决方案2】:

测试数据

DECLARE @Table TABLE
(ID INT, Value VARCHAR(10))

INSERT INTO @Table VALUES 
(1 , 'A'),
(2 , 'AB'),
(3 , 'ABC'),
(4 , 'ABCD'),
(5 , 'ABCDE'),
(6 , 'ABCDEF'),
(7 , 'ABCDEFG'),
(8 , 'ABCDEFGI'),
(9 , 'ABCDEFGIJ'),
(10 ,'ABCDEFGIJK')

查询

;WITH CTE AS (
SELECT * 
      ,NTILE(2) OVER (ORDER BY LEN(Value) DESC) rn
FROM @Table )
SELECT *
FROM CTE 
ORDER BY CASE WHEN rn = 1 THEN LEN(Value) END DESC
         ,CASE WHEN rn = 2 THEN LEN(Value) END ASC 

结果

╔════╦════════════╦════╗
║ ID ║   Value    ║ rn ║
╠════╬════════════╬════╣
║ 10 ║ ABCDEFGIJK ║  1 ║
║  9 ║ ABCDEFGIJ  ║  1 ║
║  8 ║ ABCDEFGI   ║  1 ║
║  7 ║ ABCDEFG    ║  1 ║
║  6 ║ ABCDEF     ║  1 ║
║  1 ║ A          ║  2 ║
║  2 ║ AB         ║  2 ║
║  3 ║ ABC        ║  2 ║
║  4 ║ ABCD       ║  2 ║
║  5 ║ ABCDE      ║  2 ║
╚════╩════════════╩════╝

【讨论】:

  • 这种方式可以确保顶部结果的行较长,而后半部分的行较短。
  • @Lamak 你能详细说明你的主张吗?
  • 当然。您的结果首先订购了最大长度的一半(在本例中为长度 10、9、8、7、6),然后是另一半。但是操作说他/她想要顶部和底部最大的,而不是顶部最大的,其余的在底部
【解决方案3】:

这里有一个简短的方法可以帮助您入门:

WITH cte AS
(
    SELECT TOP 1000 number
    FROM master..spt_values 
    WHERE type = 'P' and number >0
)
SELECT number,  row_number() OVER(ORDER BY CASE WHEN number %2 = 1 THEN number ELSE -(number) END) pos 
FROM cte

【讨论】:

  • 这个works well 在一个没有间隙或重复的序列上。现在想象if all values are even...
  • cte 只是为了获取数字列表。可能需要将 ROW_NUMBER 应用于原始表以获得排序列表。这也适用于所有值都是偶数并且所有值都相等。我决定专注于对编号列表进行排序,而不是编号过程本身。如果 OP 决定提供一些示例数据,情况会有所不同......我想说的是双方都懒惰......
  • 我在查询中没有看到 ORDER BY。它应该如何工作?
  • ORDER BY 是 ROW_NUMBER 函数的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多