0

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

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

对于Product No.Site ID的任何给定组合,有没有办法获取最大日期,并且只返回该日期的TS 编号?在此示例中,可以使用TOP 1,但这只是查询的缩小示例,该查询将查看Product No.Site ID的许多组合(期望的结果是所有TS Number的列表与该产品/商店组合的最新更改有关,我将用于连接到另一个查询)。

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

非常感谢

4

1 回答 1

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 添加到 order by 来使其具有确定性。然后,您会根据排序顺序获得相同 MAXDATE 的最高或最低 TS-Number。

如果您想要所有 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;
于 2017-09-12T22:10:39.040 回答