【问题标题】:SQL - Want to provide unique rank for same set of values?SQL - 想要为同一组值提供唯一的排名?
【发布时间】:2016-02-19 18:08:03
【问题描述】:

我需要帮助来确定我尝试生成唯一标识符列的日期的最后更改价格,因此我可以将分区应用于这个新列并在我的编程中导出额外的逻辑。 你能帮我推导出唯一标识符列吗?

Date        | OrderID   | Price | Seq_no |Unique-Indentifier  
1/24/2015   |   568956  |   300 |   1    |  1  
1/20/2015   |   568956  |   350 |   1    |  2  
1/20/2015   |   568956  |   375 |   2    |  3  
1/20/2015   |   568956  |   400 |   3    |  4  
1/17/2015   |   568956  |   400 |   1    |  4  
1/14/2015   |   568956  |   500 |   1    |  5  
1/11/2015   |   568956  |   500 |   1    |  5  
1/9/2015    |   568956  |   400 |   1    |  6  
1/7/2015    |   568956  |   400 |   1    |  6  
1/24/2015   |   568957  |   600 |   1    |  7  
1/20/2015   |   568957  |   600 |   1    |  7  
1/17/2015   |   568957  |   700 |   1    |  8  
1/14/2015   |   568957  |   800 |   1    |  9  
1/11/2015   |   568957  |   800 |   1    |  9  
1/9/2015    |   568957  |   700 |   1    |  10  
1/7/2015    |   568957  |   700 |   1    |  10  

我无法在价格列上应用分区。原因:对于 OrderID '568956',在两个不同的日期设置了相同的价格 400。我想隔离这两组。如果我只是在价格列上使用分区,那么我会将所有四行作为一组。所以我需要放置一些标识符来区分这些行并在我的新列“UniqueIdentifier”上应用分区。

Set 1:  
1/20/2015            568956  400         4    
1/17/2015            568956  400         4


Set 2:   
1/9/2015              568956  400         6    
1/7/2015              568956  400         6   

如果我应用分区,我会得到一组结果 - 这是我不期望的。

Set 1:  
1/20/2015             568956  400         4    
1/17/2015             568956  400         4     
1/9/2015              568956  400         4    
1/7/2015              568956  400         4

【问题讨论】:

  • 你能显示你正在使用的 SQL 吗?我不太明白这个问题以及您如何获得第 1 组的这些值
  • 当一列显然不是唯一的时候,为什么还要称它为“唯一标识符”?

标签: sql rank window-functions


【解决方案1】:

在您的选择语句中执行以下操作:

SELECT
DISTINCT
    ROW_NUMBER() OVER(PARTITION BY Date,OrderID,Price ORDER BY Date DESC) AS RowNum
    ,Date
    ,OrderID
    ,Price

根据您的 select 语句的工作方式,您可能不得不弄乱PARTITION BY 部分,但是当我使用它时,它会为每个值返回一个唯一的行号。

我不确定您是否能够准确地 ORDER BY 该日期值,因此您可能必须将其转换为 DATETIME

【讨论】:

    【解决方案2】:

    您需要识别组,然后分配序号。一种方法是行号不同。我认为这是逻辑:

    select t.*,
           dense_rank() over (partition by orderid order by grp, price) as newcol
    from (select t.*,
                 (row_number() over partition by orderid order by date, seq_no) -
                  row_number() over partition by orderid, price order by date, seq_no)
                 ) as grp
          from t
         ) t
    

    【讨论】:

    • 感谢 Gordon,这对我很有帮助。当同一天有多个价格变化时,就会出现一个问题。 2015 年 1 月 24 日 | 568956 | 300 | 2015 年 1 月 20 日 | 568956 | 350| 2 2015 年 1 月 20 日 | 568956 | 375 | 2 2015 年 1 月 20 日 | 568956 | 400 | 2 2015 年 1 月 17 日 | 568956 | 400 | 2
    • @Parthi 。 . .您的数据没有这样的例子。您需要在 date 中添加另一列以指定正确的顺序。
    • 抱歉错过了。我刚刚更新了这个问题。 2015 年 1 月 20 日 | 568956 | 350 | 2 2015 年 1 月 20 日 | 568956 | 375 | 3
    • 您需要除日期之外的另一列来定义排序。那一栏是什么?
    • 我可以添加一个名为 seq_no 的新列
    猜你喜欢
    • 2016-04-28
    • 2022-07-19
    • 1970-01-01
    • 2021-07-21
    • 2017-08-02
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多