[英]Filter out records within z table according to the newest record
我正在使用 ztable 表中的員工列表,每個員工都有唯一的 ID pernr
,但是數據庫中的每個更改都用重復的 ID 反映,因此該表如下所示:
佩恩 | 名字 | 開始日期 | 結束日期 |
---|---|---|---|
1 | 姓名1 | 1.1.2000 | 1.1.2010 |
1 | 姓名1 | 2.1.2010 | 1.1.2015 |
1 | 姓名1 | 2.1.2015 | 31.12.9999 |
2 | 姓名2 | 1.1.2016 | 1.1.2019 |
2 | 姓名2 | 2.1.2019 | 31.12.9999 |
FORM process_data.
DATA: lt_ztable TYPE TABLE OF ztable,
ls_ztable LIKE LINE OF lt_ztable,
ls_salv_table LIKE LINE OF gt_salv_table.
SELECT pernr, sname, begindate, enddate
FROM ztable
INTO CORRESPONDING FIELDS OF TABLE lt_ztable.
LOOP AT lt_ztable INTO ls_ztable
MOVE-CORRESPONDING ls_ztable to ls_salv_table.
APPEND ls_salv_table TO gt_salv_table.
ENDLOOP.
ENDFORM.
我需要什么,是從ztable篩選出的數據,並顯示為ALV cl_salv_table
通過gt_salv_table
然而,只有一個記錄,一個具有最大差異日期之間(因此與9999年結束的)。
我正在考慮在 SQL 代碼中執行此操作,創建begindate, enddate AS datediff
,盡管我不知道如何制定WHERE
語句來僅過濾差異最大的記錄。 還是在LOOP AT
部分過濾掉它會更好? 感謝您的任何想法。
您可以通過將數據選擇到以 enddate 降序排序的內部表中,然后刪除比較 pernr 的重復項來完成此操作。
FORM process_data.
SELECT pernr, sname, begindate, enddate
FROM ztable
INTO TABLE gt_salv_table
**ORDER BY pernr ASCENDING enddate DESCENDING.**
IF sy-subrc EQ 0.
DELETE ADJACENT DUPLICATES FROM gt_salv_table COMPARING pernr.
ENDIF.
ENDFORM.
正如 futu 所建議的,也可以使用 MAX(enddate),但您將無法在聚合查詢中選擇 begindate,因為 GROUP BY 子句將需要所有未聚合的字段。 如果業務邏輯允許,您可以使用 MAX(begindate) 和 MAX(enddate) 來獲取所有數據。 在這里,假設所有記錄的名稱都相同。
SELECT pernr, sname, MAX(begindate) AS begindate, MAX(enddate) AS enddate
FROM ztable
INTO TABLE @gt_salv_table
GROUP BY pernr, sname.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.