gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:03:45 26 4
gpt4 key购买 nike

我知道这显然是一个非常普遍的问题,但尽管我在这里和在 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),它可以工作,但如果一个值不同(例如价格),那么我会得到两个。

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

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

谢谢

最佳答案

有很多方法可以做到这一点,其中之一是使用 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 都不会重复。

关于sql - 每个日期仅选择一个具有 MAX(Id) 的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54039535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com