簡體   English   中英

根據最新的記錄過濾掉z表中的記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM