【问题标题】:Compare the same column in same table比较同一张表中的同一列
【发布时间】:2017-02-14 10:30:54
【问题描述】:

我需要一些帮助来解决这个问题。 我有下表 (dbo.Users) 按 ID 降序排列:

ID |  UserID | Status | Time   |
3     9200       2      2013-05-03
2     9200       1      2013-05-02
1     9200       1      2013-05-01

我想检查前两行的 Status 列是否具有不同的值,如果是,我想获取整个第一行。 我怎样才能做到这一点?

【问题讨论】:

  • SQL Server 2008
  • 嗨。我觉得题目不够清楚。我可以建议一些不同的东西吗? - “如果存在不匹配,如何比较前 2 行返回第一行?”“如何比较前 2 行?”

标签: sql sql-server sql-server-2008 join


【解决方案1】:

假设ID是唯一的,可以使用如下代码:

WITH cte 
 AS (SELECT TOP 2 * 
     FROM   dbo.users 
     ORDER  BY id DESC) 
SELECT cte1.* 
FROM   cte cte1 
   INNER JOIN cte AS cte2 
           ON cte1.id > cte2.id 
WHERE  cte1.status != cte2.status 

如果您有一个更大的表,那么与其他查询相比,这也会更快。

【讨论】:

    【解决方案2】:

    一种方法是根据 USERID 添加计算的 row_number

    SELECT ID
        ,Userid
        ,STATUS
        ,TIME
        ,ROW_Number() OVER (
            PARTITION BY UserID
            OVER BY TIME DESC
            ) AS rn
    FROM TABLE
    

    行号是按userid划分的,所以每一个userID都会重新开始行号。它是根据时间排序的,但如果你愿意,你可以改变它。如果你想过滤这个,你需要把它包装在一个外部查询中

    select * from (SELECT ID
        ,Userid
        ,STATUS
        ,TIME
        ,ROW_Number() OVER (
            PARTITION BY UserID
            ,STATUS OVER BY TIME DESC
            ) AS rn
    FROM TABLE
    )sub
    where sub.rn = 1
    

    【讨论】:

      【解决方案3】:

      假设“前两行”是指按 id 降序排列,那么:

      select u.*
      from (select top 1 u.*
            from dbo.Users u
            order by u.id desc
           ) u
      where u.status <> (select top 1 u2.status
                         from dbo.Users u2
                         where u2.id < u.id
                         order by u2.id desc
                        );
      

      第一个子查询获取第一行。第二个子查询判断状态是否等于第二行的状态。

      【讨论】:

      • 谢谢!这正是我想要的。如果我想比较 Status 以外的更多列,遵循相同的逻辑,我可以在 WHERE 语句之后添加一个 AND/OR 吗?
      • @Dias 。 . .用样本数据和期望的结果提出另一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多