【问题标题】:Merge 1st and Second Row, 3rd and 4th Row and so on合并第 1 行和第 2 行、第 3 和第 4 行等
【发布时间】:2017-01-18 17:08:49
【问题描述】:

假设我有行表,

Id  Value
----------
1    a
1    b
1    c
1    d
1    e
1    f

预期的结果应该是,

Id  Value1   Value2
-------------------
1    a        b
1    c        d
1    e        f

我在这里很困惑。

【问题讨论】:

  • 行应该按某些东西排序。价值?
  • @DuduMarkovitz 是的,当然。
  • 那么订单的标准是什么?如果ID 改变值会发生什么?
  • @Lamak 我总是在哪里 Id=SomeValue
  • @DuduMarkovitz 不,ROW_NUMBER 可从 SQL Server 2005 获得

标签: sql sql-server-2005


【解决方案1】:

好的,肯定有更简单的方法可以做到这一点,但这很有效:

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Value)
    FROM dbo.YourTable
)
SELECT  Id,
        MIN(CASE WHEN RN % 2 = 1 THEN Value END) Value1, 
        MIN(CASE WHEN RN % 2 = 0 THEN Value END) Value2
FROM CTE
GROUP BY Id,
         RN - ((RN - 1) % 2);

这是结果:

╔════╦════════╦════════╗
║ Id ║ Value1 ║ Value2 ║
╠════╬════════╬════════╣
║  1 ║ a      ║ b      ║
║  1 ║ c      ║ d      ║
║  1 ║ e      ║ f      ║
╚════╩════════╩════════╝

【讨论】:

  • GROUP BY Id, (RN - 1) / 2 有点短。
【解决方案2】:
;WITH cte AS
(
  SELECT *, ROW_NUMBER() OVER (ORDER BY value) AS RowNum
  FROM YourTable
)

SELECT 
    c1.id
  , c1.value as Value1
  , c2.value as Value2
FROM cte c1
LEFT JOIN cte c2 ON c1.rownum = c2.rownum - 1
WHERE c1.RowNum % 2 = 1

【讨论】:

    【解决方案3】:
    select      Id
               ,min(Value)  as Value1
               ,max(Value)  as Value2
    
    from       (select      Id,Value
                           ,(row_number () over 
                                (partition by Id order by Value)+1)/2 as group_id
    
                from        mytable as t
                ) t
    
    group by    Id      
               ,group_id
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2019-06-22
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多