【问题标题】:how to select rows where column value has changed如何选择列值已更改的行
【发布时间】:2017-10-24 21:12:20
【问题描述】:

我有一张表,其中有几列如下所示:

Cusnbr  Name  LoadNumber
 1       Z      10
 1       Z      9
 1       Z      8
 1       C      7
 1       C      6
 1       C      5
 1       B      4
 1       B      3
 1       A      2
 1       A      1

这只是一个 cusnbr 有数百万个这样的 cusnbr..

我想要像下面这样的输出

Cusnbr  Name  LoadNumber
 1       C      7
 1       B      4
 1       A      2

为此,我在 sql server 2008 中编写以下查询:

;With x as
 (
   Select * ,rn=Row_number() over (order by cusnbr,loadnumber) from table
 )
 select x.* from x left outer join x as y  on x.rn=y.rn+1
 and x.name<>y.name  where y.name is not null

但我在上面的代码中没有得到想要的输出,我得到了最后一个 Z,这也是我不想要的,而且我得到的不规则数据不是我想要的正确格式

任何帮助将不胜感激!

我想要这样但无法获得所需的输出

I use this example

【问题讨论】:

  • 不清楚。你想找到最大的数字吗?
  • 不是我想要的最后一个更改行的最大数字
  • 列需要排序。您在给出的示例中对哪些列进行了排序?

标签: sql-server row common-table-expression


【解决方案1】:

虽然我不清楚这个问题,但从输出中猜测我已经尝试了 Dense Rank 。我猜你想要具有最高 LoadNumber 的同名记录。

 Select * from cteTrial where LoadNumber in (
 Select MAX(x.LoadNumber) as LoadNumber from (
 Select cusnbr , name , LoadNumber , DENSE_RANK() over (order by Name desc ) 
 as Dense from cteTrial) as x group by x.Dense 
 ) 

如果您可以使用 CTE,它将产生更好的性能。

【讨论】:

  • ctetrail 是我的 cte 或表格的 x
  • cteTrial 是表名我没用过CTE
  • 我更新我的问题有一个链接我使用该代码
  • 您的查询将提供最大负载数数据我想要最新的更新日期,无论负载数是多少
【解决方案2】:

我按照预期编写了代码

;With cte(Cusnbr , Name , LoadNumber)
AS
(
SELECT 1,'Z', 10 Union all
SELECT 1,'Z', 9  Union all
SELECT 1,'Z', 8  Union all
SELECT 1,'C', 7  Union all
SELECT 1,'C', 6  Union all
SELECT 1,'C', 5  Union all
SELECT 1,'B', 4  Union all
SELECT 1,'B', 3  Union all
SELECT 1,'A', 2  Union all  
SELECT 1,'A', 1
)
SELECT cusnbr, 
       NAME, 
       loadnumber 
FROM   (SELECT *, 
               Row_number() 
                 OVER( 
                   partition BY NAME 
                   ORDER BY loadnumber DESC) AS RNk, 
               Row_number() 
                 OVER( 
                   ORDER BY (SELECT 1)) - 1  AS RNO 
        FROM   (SELECT * 
                FROM   cte)dt)DT2 
WHERE  DT2.rnk = 1 
       AND rno > 0 
ORDER  BY NAME DESC 

结果

cusnbr  NAME    loadnumber
-------------------------
1        C          7
1        B          4
1        A          2

【讨论】:

  • 为什么你在 cte 中获取所有价值只是一条记录,它们是百万条记录
  • 已在本地测试了该查询
  • 你的输出是错误的朋友可以请你再检查一遍
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2020-05-26
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多