在列中的前两个日期限制行。怎么样?

问题描述 投票:1回答:2

是否可以仅查询客户的第一和第二个日期?我尝试执行UP TO 2 ROWS,但它仅将表限制为2行。

SELECT knvv~kunnr vbak~vbeln vbak~erdat FROM vbak INNER JOIN knvv ON vbak~kunnr = knvv~kunnr.

上述查询的示例结果将是:

Customer no.    Document No            Date
1               100000                 01/01/18
1               200000                 01/02/18
1               300000                 01/03/18
1               400000                 01/04/18
2               100001                 01/01/18
2               200000                 01/04/18
2               100040                 01/06/18

但是我需要它仅限制每个客户的前两个日期。结果必须是这样。只能像每个客户的前两个日期一样,如下所示。是否可以在查询中执行此操作?

Customer no.    Document No            Date
1               100000                 01/01/18
1               200000                 01/02/18
2               100001                 01/01/18
2               200000                 01/04/18
sap abap hana
2个回答
1
投票
SELECT CustomerNo,DocumentNo,Date,(@Count:= if(@TempID - CustomerNo = 0,@Count +1,1)) Counter,(@TempID:=CustomerNo) Tempid
FROM vbak, (Select @Count:=0) counter, (Select @TempID:=0) tempid
having Counter<= 2 order by CustomerNo;

您可以尝试这个。基本上,我声明了2个变量(@Count和@TempID),并且都设置为0。最初,对于第一行,@ TempID-CustomerNo = -1将条件设置为false并将其设置为1,然后将其递增。然后,@ TempID设置为该行的当前CustomerNo。

下一行将产生@TempID-CustomerNo = 0并导致条件为true,并递增@Count + 1。

依此类推,

Having语句选择小于或等于2的Counter,然后返回所需的结果。

希望这会对您的应用程序有所帮​​助。


1
投票

我在OpenSQL中找不到通过单个查询执行此操作的方法。它似乎没有提供所需的子查询或窗口函数。

但是,我注意到您添加了hana标签。使用SAP HANA,可以通过ABAP管理的数据库过程(AMDP)或等效的脚本化“计算视图”来轻松实现这一目标:

METHOD select BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
  USING vbak.

  lt_first_dates = SELECT kunnr,
                          min(erdat) AS erdat
                     FROM vbak
                     GROUP BY kunnr;

  lt_second_dates = SELECT kunnr,
                           min(erdat) AS erdat
                      FROM vbak
                      WHERE (kunnr, erdat) NOT IN ( SELECT * FROM :lt_first_dates )
                      GROUP BY kunnr;

  lt_first_two_dates = SELECT * FROM :lt_first_dates
                       UNION
                       SELECT * FROM :lt_second_dates;

  et_result = SELECT src.kunnr,
                     src.vbeln,
                     src.erdat
                FROM vbak AS src
                WHERE (kunnr, erdat) IN ( SELECT * FROM :lt_first_two_dates )
                ORDER BY kunnr, vbeln, erdat;

ENDMETHOD.
© www.soinside.com 2019 - 2024. All rights reserved.