获取过去记录的数据

时间:2019-01-28 23:32:23

标签: sql db2 logical-operators toad

我有2个表,即table1和table2。

我要实现的目标:

我想返回有关员工的当月信息

AND

当他们从表2创建帐户时,他们可能已经更改了今天的头寸,因此我想在某个时间点和当前位置同一行上捕获信息。

大学课程表

Table 1
Name  Acct_Cr_DT
a1    12/1/2018
b1    1/4/2018
c1    5/6/2018

上个月(12/29)和当前月份数据(1/29/2019)。假设数据在每个财政月的最后一天刷新。

Table 2
Name  position  gender  Emp status  FISCAL_MONTH_END_DATE
a1    Analyst   M       hourly      12/29/2018
b1    Intern    F       hourly      12/29/2018
c1    Director  F       hourly      12/29/2018
a1    Manager   M       hourly      1/29/2019
b1    Analyst   F       hourly      1/29/2019
c1    Director  F       hourly      1/29/2019

a1在创建帐户时是一名分析师。 b1是创建帐户时的实习生。

示例输出:创建帐户之前,需要提供帐户创建时的信息。

Name  Acct_Cr_DT  position  gender  Emp status  FISCAL_MONTH_END_DATE
a1    12/1/2018   Analyst   M       hourly      1/29/2019
b1    1/4/2018    Intern    F       hourly      1/29/2019
c1    5/6/2018    Director  F       hourly      1/29/2019

4 个答案:

答案 0 :(得分:0)

如果要返回表1的当前月份信息,则

SELECT *
FROM YOUR_TABLE
WHERE MONTH(COLUMN_NAME) = MONTH(GETDATE())
AND YEAR(COLUMN_NAME) = YEAR(GETDATE())

但是,从您的解释来看,您需要一个连接语句以便在同一时间点和当前位置捕获信息。所以你可能需要这个:

SELECT *
FROM TABLE_1 a inner join TABLE_2 b on a.id=b.id
WHERE MONTH(COLUMN_NAME) = MONTH(GETDATE())
AND YEAR(COLUMN_NAME) = YEAR(GETDATE())

请提供示例输出以进一步说明。

答案 1 :(得分:0)

在这里您可以尝试以下查询。

选择TB1。名称,Acct_Cr_DT,位置,性别,Emp状态,FISCAL_MONTH_END_DATE 从表1 tb1 内连接表2 tb2 ON tb1.name = tb2.name DATEPART(YEAR,Acct_Cr_DT)= DATEPART(YEAR,FISCAL_MONTH_END_DATE)和DATEPART(MONTH,FISCAL_MONTH_END_DATE)='12'和DATEPART(DAY,FISCAL_MONTH_END_DATE)='29'

在创建帐户时以及在一年中的最后一天刷新记录时获取记录。

答案 2 :(得分:0)

应该可以使用出色的DB2 OLAP函数(也称为窗口函数)来解决这个问题。

以下代码使用子查询提取每个员工的第一位,并按月末财务记录进行排序。然后,外部查询将结果与table2结合在一起以获取员工的聘用日期,并过滤与该月的最近财务月末相对应的记录。

SELECT 
    tx.name, tx.first_position, tx.gender, tx.emp_status, tx.fiscal_month_end_date, t1.acct_cr_dt
FROM (
    SELECT
        t2.*,
        FIRST_VALUE(t2.position) OVER(PARTITION BY t2.name ORDER BY fiscal_month_end_date) first_position,
        DENSE_RANK() OVER (ORDER BY t2.fiscal_month_end_date desc) rnk
    FROM table2 t2
  ) tx INNER JOIN table1 t1 ON t1.name = tx.name
 WHERE tx.rnk = 1;

在此 DB Fiddle demo 中,查询产生:

| name | first_position | gender | emp_status | fiscal_month_end_date | acct_cr_dt |
| ---- | -------------- | ------ | ---------- | --------------------- | ---------- |
| a1   | Analyst        | M      | hourly     | 2019-01-29            | 2018-12-01 |
| b1   | Intern         | F      | hourly     | 2019-01-29            | 2018-01-04 |
| c1   | Director       | F      | hourly     | 2019-01-29            | 2018-05-06 |

NB:这是一个MySQL 8.0提琴,因为没有野生的DB2 db fiddlde ...

答案 3 :(得分:0)

我自己找到了答案。

Basically you'll have to join on Name and make sure the "Acct Create DT" is 
<=FISCAL_MONTH_END_DATE" to get the info for point in time for that employee.

Now after that, create a sub-query with a LEFT JOIN on Table 2 and extract the current 
"FISCAL_MONTH_END_DATE" to return current month data