我知道这显然是一个非常普遍的问题,但是尽管我在这里和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。
我发现了很多与此有关的问题,但是通常都使用简化的示例,并且一旦添加了额外的列,我就会得到比我应有的更多的行。
谢谢
答案 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)
上有一个索引,它应该具有很好的性能。