【问题标题】:Query to eliminate a row based on date value and duplicate on another row查询以根据日期值消除一行并在另一行上重复
【发布时间】:2016-02-16 15:38:08
【问题描述】:

我想根据以下条件消除行 如果列WORK_DATE 有重复的日期,那么我需要排除基于CHEQUE_DATE23-JAN-2015 的行,但保留其他行。 主唯一键是EMP_ID

表格内容:

 EMP_ID |  WORK_DATE  | CHEQUE_DATE
------------------------------------
  12345 | 10-SEP-2014 | 23-JAN-2015
  12345 | 10-SEP-2014 | 03-OCT-2015
  32789 | 14-OCT-2014 | 23-JAN-2015
  32789 | 14-OCT-2014 | 10-OCT-2015

因此,在所有员工的工作日期重复的情况下,删除具有CHEQUE_DATEJan 23, 2015 的行。

我想可以使用UNION 子句来解决。

【问题讨论】:

  • 主键怎么可能是col1?它有重复。
  • 您希望在输出中看到什么?另外,指定 cheque_date 背后的逻辑是什么?您是在最新 cheque_date 的那一行之后吗?
  • Gordon,是的,我很抱歉,唯一的 cols 是 col1、col2 和 col3

标签: sql oracle duplicates


【解决方案1】:

您可以将条件转换为where 子句。假设支票没有重复的日期:

delete from data
    where exists (select 1
                  from data d2
                  where d2.col1 = data.col1 and d2.work_date = data.work_date and
                        d2.cheque_date <> data.cheque_date
                 ) and
          cheque_date = date '2015-01-23';

【讨论】:

    【解决方案2】:

    谢谢 Gordon,根据您的建议,我提出了以下建议。 这有点复杂,因为涉及到多个表……但您的指导有所帮助。

    SELECT
               T.EMP_GROUP_CODE  GROUP_CODE,
               E.EMPLOYEE_ID   EMP_ID,
               SUBSTR(E.SURNAME||', '||nvl(E.FIRST_NAME,' '),1,30)
                                      EMPLOYEE_NAME,
              SUBSTR(TO_CHAR(T.WORK_DATE,'DD-MON-YYYY'),1,11) WORK_DATE,
               SUBSTR(TO_CHAR(C.CHEQUE_DATE,'DD-MON-YYYY'),1,11) CHQ_DATE,
               L.ABBRV_NAME  LOCATION_NM,
               SUBSTR(R.SURNAME||', '||R.FIRST_NAME,1,25) REPLACEMENT_NAME,
               T.UNITS_IN_PERIOD,
               T.HOURLY_RATE,
               T.WORK_DATE  SORT_DATE FROM EC_LOCATION             L,
                      EC_PAY_PERIOD_CALENDAR  C,
                      EC_EMPLOYEE             E,
                      EC_EMPLOYEE             R,
                      EC_EMPLOYEE_TIMESHEETS  T
                WHERE L.CODE = T.LOCATION_CODE
                  AND C.PAY_NUMBER = T.PAY_NUMBER
                  AND C.EMP_GROUP_CODE = T.EMP_GROUP_CODE
                  AND E.EMPLOYEE_ID = T.EMPLOYEE_ID
                  AND T.REPLACED_EMPLOYEE_ID = R.EMPLOYEE_ID (+)
                  AND (:P_EMP_GROUP = 'ALL'
                     OR  T.EMP_GROUP_CODE = :P_EMP_GROUP)
                  AND T.WORK_DATE BETWEEN to_date(:P_START_DATE,'YYYYMMDD') AND to_date(:P_END_DATE,'YYYYMMDD')
                  AND T.EMP_GROUP_CODE IN ('5132E','5132S','5131DE','5131DS')
                  AND (EXISTS (select 1 from ec_employee_timesheets a, ec_pay_period_calendar b where a.PAY_NUMBER = b.PAY_NUMBER
                           AND a.EMP_GROUP_CODE = b.EMP_GROUP_CODE AND SUBSTR(TO_CHAR(b.CHEQUE_DATE,'DD-MON-YYYY'),1,11) <>
        '23-JAN-2015'));
    

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多