SAP HANA SQL - 返回最大日期和相关属性,但忽略其他记录

时间:2017-09-12 16:43:46

标签: sql max sap hana hana-sql-script

我面临的问题是我正在尝试查询SAP HANA以返回一个唯一代码列表,这些代码引用了对数据库进行更改的一个实例。对于下面图片的一些背景知识,每次更改都有一个相关的网站ID 产品编号,我将它们一起用作变量,以便找到<最近日期的强> TS编号。

但是,当我使用SELECT MAX(DATAB)函数时,它会强制我使用GROUP BY子句。但是,因为我不能从GROUP BY子句中省略 TS编号,所以它将返回所有三个。

对于产品编号网站ID 的任何给定组合,是否有办法获取最长日期,并且只返回 TS编号那个日期?在此示例中,使用TOP 1会很好,但这只是一个查询的缩小示例,该示例将查看产品编号网站ID的多种组合(期望的结果是与该产品/商店组合的最新更改相关的所有 TS编号的列表,我将用于连接到另一个查询)。

任何帮助将不胜感激。如果需要全桌设计等,以便人们可以尝试复制问题,我很乐意提供这个,但我希望这是一个我没想过的简单解决方案......

非常感谢

1 个答案:

答案 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;