每个日期仅选择一个具有MAX(Id)的产品

时间:2019-01-04 13:06:10

标签: sql sql-server greatest-n-per-group

我知道这显然是一个非常普遍的问题,但是尽管我在这里和Google上进行了所有搜索,但我仍无法根据自己的情况调整我的发现。

我以为这很简单,但是我是SQL的新手,恐怕我不了解这一逻辑。

基本上,这是我的数据集: 作品集(客户端)列表,按日期,每个作品集和日期的ID,如果对作品集进行了修改,则保留上一个作品集,但是为同一作品集添加新行,并且ID为增量。

Date       | Client | ProductCode | ID |  Price
-----------|--------|-------------|----|--------
2019-01-01 |   C1   |      A      | 1  |  100
2019-01-02 |   C1   |      A      | 2  |  100
2019-01-03 |   C1   |      B      | 3  |  100
2019-01-01 |   C1   |      A      | 4  |  150
2019-01-02 |   C1   |      A      | 5  |  150
2019-01-03 |   C1   |      B      | 6  |  150
2019-01-02 |   C2   |      B      | 1  |  150
2019-01-02 |   C2   |      X      | 2  |  150

期望的输出是:对于给定的日期,如果我有两次相同的作品集,则我只想要最新的(最高ID)以及相应的价格(最终还有一些额外的列)

Date       | Client | ProductCode | ID |  Price
-----------|--------|-------------|----|--------
2019-01-01 |   C1   |      A      | 4  |  150
2019-01-02 |   C1   |      A      | 5  |  150
2019-01-03 |   C1   |      B      | 6  |  150
2019-01-02 |   C2   |      X      | 2  |  150

我尝试过:

SELECT Date, Client, ProductCode , Price, MAX(ID)
From myTable
Group BY Date, Client, ProductCode , Price

在我有两次相同的行(具有不同ID)的情况下,它可以工作,但是如果一个值不同(例如Price),那么我都会得到。

然后我尝试使用ROW_NUMBER() over(partition by Client ORDER BY ID),然后选择MAX,但是我只是在创建一个新ID,然后回到平方1。

我发现了很多与此有关的问题,但是通常都使用简化的示例,并且一旦添加了额外的列,我就会得到比我应有的更多的行。

谢谢

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,其中之一是使用row_number函数

WITH C AS(
SELECT Date
     , Client
     , ProductCode 
     , Price
     , ROW_NUMBER() OVER(PARTITION DATE, FOLIO, PRODUCTCODE ORDER BY ID DESC) AS RN 
From myTable
)
SELECT Date
     , Client
     , ProductCode 
     , Price
FROM C 
WHERE RN = 1 

在这种情况下,您要做的是创建一个CTE(它像子查询一样工作,但更易于读取),然后应用row_number并按日期,作品集,产品代码对行进行分区并按ID对其进行排序,这将返回您您当前的列表中带有rn,然后过滤rn,与此有关的一个好处是,每种情况下rn不会重复。

答案 1 :(得分:3)

使用where选择所需的行。一种方法使用相关的子查询:

select t.*
from myTable t
where t.id = (select max(t2.id)
              from mytable t2
              where t2.date = t.date and t2.client = t.client
             );

(client, date, id)上有一个索引,它应该具有很好的性能。