获取整个月都在工作人员,代码为:db2

tnkciper  于 2022-11-23  发布在  DB2
关注(0)|答案(2)|浏览(135)

假设我有一个包含以下信息的表:sq db2

ID        NAME     Date1           Date2          code
      01        Tommy     2022-09-10     2022-09-30     45
      01        Tommy     2022-10-01     2022-12-31     44
      02        Elis      2022-07-13     2022-08-03     45
      02        Elis      2022-08-04     2022-08-31     45
      03        John      2022-08-10     2022-09-27     44
      04        John      2022-09-28     null           45

有没有一种方法,我可以在表上执行选择,以获得以下(sql:DB2)我的意思是得到所有的人,整个月的工作,并有45(代码)整个月(同一个月). Elisa她工作八月,并有45整个八月作为代码

ID         NAME     Date1           Date2          code        
             
      02        Elis      2022-07-13     2022-08-03     45           
      02        Elis      2022-08-04     2022-08-31     45

对我来说很难
谢谢

wgx48brx

wgx48brx1#

1.创建一个按ID对数据进行GROUPS的子查询。

  1. HAVINGMAXDate2,并将其与Date2的该月最后一天进行比较。
  2. HAVINGMINDate1,并将其与Date1的该月第一天进行比较。
  3. WHEREcode ='45'
SELECT a.ID, a.NAME, a.Date1, a.Date2, a.Code
FROM Emloyee a
INNER JOIN (SELECT ID
            FROM Emloyee 
            WHERE code = '45'
            GROUP BY ID, NAME 
            HAVING MAX(Date2) BETWEEN MAX(Date2) AND MAX(LAST_DAY(Date2))
            AND MIN(Date1) BETWEEN MIN(Date1) AND MAX(Date1 - (day(Date1) -1) days)
) b ON a.ID = b.ID
ORDER BY a.ID ASC
    • 结果:**
| ID | NAME | DATE1      | DATE2      | CODE  |
|----|------|------------|------------|-------|
| 2  | Elis | 2022-07-13 | 2022-08-03 | 45    |
| 2  | Elis | 2022-08-04 | 2022-08-31 | 45    |

小提琴

kninwzqo

kninwzqo2#

类似的任务通常用下面的方法来解决。这不是一个完整的解决方案,而是一个开始的方法。

WITH 
  MYTAB (ID, NAME, Date1, Date2, code) AS 
(
VALUES
  ('01', 'Tommy', DATE ('2022-09-10'), DATE ('2022-09-30'), 45)
, ('01', 'Tommy', DATE ('2022-10-01'), DATE ('2022-12-31'), 44)

--, ('02', 'Elis',  DATE ('2022-07-13'), DATE ('2022-08-03'), 45)
, ('02', 'Elis',  DATE ('2022-07-13'), DATE ('2022-07-14'), 45)
, ('02', 'Elis',  DATE ('2022-07-16'), DATE ('2022-08-03'), 45)
, ('02', 'Elis',  DATE ('2022-08-04'), DATE ('2022-08-31'), 45)

, ('03', 'John',  DATE ('2022-08-10'), DATE ('2022-09-27'), 44)
, ('04', 'John',  DATE ('2022-09-28'), CAST (null AS DATE), 45)
)
, G AS
(
-- Group number calculation with GRP
-- All records with the same (ID, NAME, GRP) have consecutive (DATE1, DATE2)
SELECT 
  T.*
, SUM
  (
    CASE 
      WHEN DATE1 = LAG (DATE2) OVER (PARTITION BY ID, NAME ORDER BY DATE2) + 1 
      THEN 0
      ELSE 1
    END
  ) OVER (PARTITION BY ID, NAME ORDER BY DATE1)
  AS GRP 
FROM MYTAB T
WHERE CODE = 45
)
SELECT 
  G.*
, MIN (G.DATE1) OVER (PARTITION BY ID, NAME, GRP) AS DATE1_MIN
, MAX (G.DATE2) OVER (PARTITION BY ID, NAME, GRP) AS DATE2_MAX
FROM G

| 识别码|名称|日期1|日期2|代码|毛利率|日期1_分钟|日期2_最大|
| - -| - -| - -| - -| - -| - -| - -| - -|
| 01年|托米|2022年9月10日|2022年9月30日|四十五|一个|2022年9月10日|2022年9月30日|
| 二|伊利斯|2022年7月13日|2022年7月14日|四十五|一个|2022年7月13日|2022年7月14日|
| 二|伊利斯|2022年7月16日|2022年8月3日|四十五|2个|2022年7月16日|2022年8月31日|
| 二|伊利斯|2022年8月4日|2022年8月31日|四十五|2个|2022年7月16日|2022年8月31日|
| 04年|若翰|2022年9月28日||四十五|一个|2022年9月28日||
首先计算附加的"组"列(示例中为GRP)。
具有相同(ID、NAME、GRP)的所有记录都具有连续的(DATE1、DATE2)日期间隔。
最后,为每个这样的组计算(最小、最大)日期。
最困难的部分是为每个(min,max)区间构造一个表达式来理解,如果它在通常情况下覆盖了整个unknown月份(当然,对于一些fixed knownmonth来说很容易)。

相关问题