简体   繁体   中英

count :SQL :DB2

I have this table:

CODE IDNR NAME LIMIT
123 80 XXX 2019-05
123 81 XXX 2019-10
124 80 YYY 2019-01
125 80 ZZZ 2019-05
125 81 ZZZ 2019-06
125 80 ZZZ 2019-07
126 80 III 2019-05
126 80 III 2019-09
126 80 III 2019-07

I want to have a new column (Count-LIMIT ) contain how many LIMIT per code, and another contain YES if the limit are continuous and No if not. MY RESULT that I want like:

CODE IDNR NAME LIMIT Count-Limit CON
123 80 XXX 2019-05 2 NO
123 81 XXX 2019-10 2 NO
124 80 YYY 2019-01 1 NO
125 80 ZZZ 2019-05 3 YES
125 81 ZZZ 2019-06 3 YES
125 80 ZZZ 2019-07 3 YES
126 80 III 2019-05 3 NO
126 80 III 2019-09 3 NO
126 80 III 2019-07 3 NO

THANKS!

Try this:

WITH T (CODE, IDNR, NAME, LIMIT) AS
(
VALUES
  (123, 80, 'XXX', '2019-05')
, (123, 81, 'XXX', '2019-10')
, (124, 80, 'YYY', '2019-01')
, (125, 80, 'ZZZ', '2019-05')
, (125, 81, 'ZZZ', '2019-06')
, (125, 80, 'ZZZ', '2019-07')
, (126, 80, 'III', '2019-05')
, (126, 80, 'III', '2019-09')
, (126, 80, 'III', '2019-07')
)
SELECT 
  T.*
, COUNT (1) OVER (PARTITION BY CODE) AS COUNT_LIMIT
, DECODE
(
  TO_DATE (LIMIT || '-01', 'YYYY-MM-DD') 
, COALESCE
  (
    LAG  (TO_DATE (LIMIT || '-01', 'YYYY-MM-DD')) OVER (PARTITION BY CODE ORDER BY LIMIT) + 1 MONTH
  , LEAD (TO_DATE (LIMIT || '-01', 'YYYY-MM-DD')) OVER (PARTITION BY CODE ORDER BY LIMIT) - 1 MONTH
  )
, 'YES', 'NO'
) AS CON
FROM T
ORDER BY CODE, LIMIT

The result is:

CODE IDNR NAME LIMIT COUNT_LIMIT CON
123 80 XXX 2019-05 2 NO
123 81 XXX 2019-10 2 NO
124 80 YYY 2019-01 1 NO
125 80 ZZZ 2019-05 3 YES
125 81 ZZZ 2019-06 3 YES
125 80 ZZZ 2019-07 3 YES
126 80 III 2019-05 3 NO
126 80 III 2019-07 3 NO
126 80 III 2019-09 3 NO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM