【问题标题】:T-SQL ORDER BY one column with mixing by anotherT-SQL ORDER BY 一列与另一列混合
【发布时间】:2017-01-17 13:36:36
【问题描述】:

我真的需要你的帮助。我必须从 SQL 表中获取一些具有特定顺序的数据。所有数据应按KeyID 降序排列,但如果第二列中存在一定数量的具有相同数据的行,则它们必须由另一行分隔。

例如,我们有这样的表:

KeyID    UserID
1         15
2         17
3         19
4         19
5         15
6         17
7         17

在结果表中应该是

KeyID    UserID
7         17
5         15
6         17
4         19
2         17
3         19
1         15

有什么办法可以做到吗?

【问题讨论】:

    标签: sql sql-server tsql sql-order-by


    【解决方案1】:

    这不会产生你正在寻找的那种,但它应该分散 keyid:

    order by row_number() over (partition by userId order by keyid desc),
             keyid desc
    

    【讨论】:

    • 这不是我需要的,但它是最好的变体
    【解决方案2】:

    这应该适用于最多 2 个连续记录共享相同 UserID 的简单情况:

    SELECT KeyID, UserID
    FROM (
       SELECT KeyID, UserID,
              rn, COUNT(*) OVER (PARTITION BY UserID, grp ORDER BY KeyID DESC) AS rnk
       FROM (
          SELECT KeyID, UserID,
                 ROW_NUMBER() OVER (ORDER BY KeyID DESC) AS rn,
                 ROW_NUMBER() OVER (ORDER BY KeyID DESC) - 
                 ROW_NUMBER() OVER (PARTITION BY UserID 
                                    ORDER BY KeyID DESC) AS grp
          FROM mytable) AS t) AS x
    ORDER BY rn + rnk, KeyID 
    

    【讨论】:

      【解决方案3】:

      下面的查询运行良好,符合您的预期。

      WITH TEMP AS(
      SELECT  *,
              ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY KEYID DESC)ROW,
              ROW_NUMBER()OVER(ORDER BY KEYID DESC)ROW1 
      FROM    USERS
              )
      
      SELECT  KEYID,USERID 
      FROM    (
              SELECT KEYID,USERID,ROW1,ROW FROM TEMP
              WHERE ROW<>2
              UNION 
              SELECT KEYID,USERID,ROW1+1 ROW1, ROW FROM TEMP
              WHERE ROW=2
              )B
      ORDER BY ROW1 ASC
      

      这是我的输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 2014-10-12
        • 1970-01-01
        • 2014-06-30
        • 2023-02-22
        • 1970-01-01
        • 2013-03-15
        相关资源
        最近更新 更多