我面临的问题是我正在尝试查询SAP HANA以返回一个唯一代码列表,这些代码引用了对数据库进行更改的一个实例。对于下面图片的一些背景知识,每次更改都有一个相关的网站ID 和产品编号,我将它们一起用作变量,以便找到<最近日期的强> TS编号。
但是,当我使用SELECT MAX(DATAB)
函数时,它会强制我使用GROUP BY
子句。但是,因为我不能从GROUP BY
子句中省略 TS编号,所以它将返回所有三个。
对于产品编号和网站ID 的任何给定组合,是否有办法获取最长日期,并且只返回 TS编号那个日期?在此示例中,使用TOP 1
会很好,但这只是一个查询的缩小示例,该示例将查看产品编号和网站ID的多种组合(期望的结果是与该产品/商店组合的最新更改相关的所有 TS编号的列表,我将用于连接到另一个查询)。
任何帮助将不胜感激。如果需要全桌设计等,以便人们可以尝试复制问题,我很乐意提供这个,但我希望这是一个我没想过的简单解决方案......
非常感谢
答案 0 :(得分:1)
与支持窗口函数的任何其他SQL-DB一样,您可以使用row_number()或rank()函数来获得所需的结果。使用哪一个取决于你想如何处理平局值。
如果您只想要一个TS-Number,以防同一个MAXDATE有多个TS-Number,请使用以下SQL:
select dat, ts_nr, pr_nr, site
from
(select *, row_number() over ( partition by pr_nr, site order by dat desc ) rownum
from mytab
)
where rownum = 1;
请注意,结果是不确定的。但是,您可以(在大多数情况下应该!)通过在窗口order by子句中将ts_nr添加到订单中来使其成为确定性的。然后根据排序顺序获得相同MAXDATE的最高或最低TS编号。
如果你想要所有TS-Numbers以防同一个MAXDATE有多个TS-Numbers,请使用rank()而不是row_number(),如下所示:
select dat, ts_nr, pr_nr, site
from
(select *, rank() over ( partition by pr_nr, site order by dat desc ) ranknum
from mytab
)
where ranknum = 1;