【问题标题】:Merge two time periods into one period将两个时间段合并为一个时间段
【发布时间】:2012-02-07 15:34:14
【问题描述】:

我正在使用一个用 .NET 和 Oracle 构建的 HR 系统,我们在其中存储:

  • 一张表中包含开始/停止日期的就业历史记录,例如组织、工作百分比、成本单位等
  • 另一个表中带有开始/停止日期的工资信息,例如月薪、小时薪

每次更改此表中的任何属性时,我们都会创建一个新行并设置上一个周期的停止日期。

通常,当我们想向用户展示 if 时,我们只展示两个表中的一小部分属性 - 例如组织和月份薪水,以查看员工薪水的历史发展,这就是它开始的地方要坚强。

如果我们只加入表格,每次更改都会得到一行,如果组织/月薪没有变化,但其他属性没有变化,则会向用户呈现一个丑陋的混乱列表 - “为什么会有两行”是我们支持的一个非常相关的问题。 “亲爱的用户 - 这是因为我们将数据存储到表中”不是一个好的答案;)

数据: 开始日期停止日期组织工作百分比月薪 2011-01-01 2011-01-15 销售额 50 25000 2011-01-16 2011-06-01 销售额 100 25000 2011-06-02 发展 100 35000 仅查询没有日期合并的开始/停止/组织月薪时的结果 开始日期 停止日期 组织 月薪 2011-01-01 2011-01-15 销售额 25000 2011-01-16 2011-06-01 销售额 25000 2011-06-02 发展35000

问题是我们必须合并选定属性相等的时间段 - 可以更改开始/结束日期,因为可以更改其他未选择的属性。

这是我只查询开始/停止/组织月薪时想要的结果。前两行合并为一个 开始日期 停止日期 组织 月薪 2011-01-01 2011-06-01 销售额 25000 2011-06-02 发展35000

我们已经通过一个非常复杂且性能不佳的 sql 语句解决了这个问题。

有没有人解决过类似的用例?或者有什么方法建议?

非常感谢任何帮助!

最好的问候 /安德斯

【问题讨论】:

    标签: c# .net oracle10g


    【解决方案1】:

    organizationmonthsalary 分组,因为它们不会改变。然后,您可以通过取最小值 startdate 和最大值 stopdate 来合并周期。这是假设句点之间没有空格:

    with USRDAT as
           (select to_date('01/Jan/2011') as STARTDATE, to_date('15/Jan/2011') as STOPDATE, 'Sales' as ORGANIZATION, 25000 as MONTHSALARY from dual
            union all
            select to_date('16/Jan/2011'), to_date('01/Jun/2011'), 'Sales', 25000 from dual
            union all
            select to_date('02/Jun/2011'), null, 'Development', 35000 from dual)
      select min(STARTDATE) as STARTDATE, max(STOPDATE) as STOPDATE, ORGANIZATION, MONTHSALARY
        from USRDAT
    group by ORGANIZATION, MONTHSALARY
    

    【讨论】:

    • 漂亮!您使用的假设完全适用!工作经历在工作中没有空白。如果一个人被重新雇用 - 该人将获得另一个雇员 ID!非常感谢!
    【解决方案2】:

    我在我的 HR 应用上做了一些类似的事情,我所做的是:

    select distinct salary, xxx fields and then group by for all the fields
    

    但也许只有不同的薪水就足够了。我必须说我在谈论 sql server,我不了解 Oracle,但我想“不同”也在那里。 ;-)

    【讨论】:

    • 日期(开始/停止日期)并不明显,所以每次更改我仍然会得到一行。所以问题是如何合并我选择的属性没有变化的时期。
    • 不同的是工资字段没有星号/停止日期。通过不同的和分组,我几乎做了同样的事情,除了我得到的是每天工作小时数的行(即不同部门每月 30 行,我仍然返回一个月,就像 x 用户在开发上工作了 50 小时,在开发上工作了 30 小时)销售,我几乎可以肯定你需要“分组依据”)。
    • 棘手的部分是在 select 和 group by 上添加或删除字段以获得您需要的行数。我花了几个小时... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多