仅限制查询的前两个日期的查询。可能吗

时间:2018-08-21 02:55:59

标签: sap abap hana

是否可以仅查询客户的第一和第二个日期?我尝试执行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

2 个答案:

答案 0 :(得分: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,然后返回所需的结果。

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

答案 1 :(得分: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.