对 table 中的记录进行分组

Grouping records from a table

请查看此文件中的数据: https://drive.google.com/file/d/1gewGZst9zwEzntK9LnwZT4j86rHMVICS/view?usp=sharing

此数据表示特定日期特定产品的配方(在 pmd_ppm_pr_code 列中标识的产品和 pmd_pi_code 列中的成分)。我需要做的是获取特定产品的最新配方。这是我整理的 SQL;

select
    pmd_ppm_sio_reference
    ,pmd_ppm_pr_code
    ,pmd_ppm_date_effective
    ,pmd_percentage
    ,pmd_pi_code
    ,row_number()
    over(partition by pmd_ppm_pr_code, pmd_pi_code
        order by pmd_ppm_pr_code, pmd_pi_code, trunc(pmd_ppm_date_effective) desc) as "row"
from ppm_details
where pmd_ppm_sio_reference = 1801
and pmd_ppm_pr_code = 'A24052'

where子句只是为了限制结果,让我见树见木。

这是结果; https://drive.google.com/file/d/1mH7n0Q5yQYukJvgR7sh94OsdUaD8sXY_/view?usp=sharing

问题出在行 = 1 的组中的最后一项。那是因为该成分未在最新配方中使用,但它为我提供了使用该成分的最新条目。

我已经尝试将日期添加到分区中,但所做的只是为每一行提供 row = 1。

您的数据中有一列表示配方 - 让我随机猜测这是 pmd_ppm_pr_code。我假设生效日期是最近的日期。让我假设配方中的所有产品都具有相同的生效日期。

如果是这样,您要使用 dense_rank(),而不是 row_number():

dense_rank() over (partition by pmd_ppm_pr_code order by pmd_ppm_date_effective desc) as seqnum

您的版本 returns 每个产品的最新日期 分别 。这个 returns 最新的食谱。

请注意,您的 order by 重复了分区列。这是完全没有必要的。 order by 在 一个分区内