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