简体   繁体   English

根据 SQL 条件分配季度数

[英]Assign number of quarter over years on SQL condition

I'm working on quarter counter that would be recognizing data gaps by quarter.我正在研究季度计数器,它将按季度识别数据差距。

Here is my data:这是我的数据:

Year  Quarter  Department
2017  1        A 
2017  2        A
2017  3        A
2017  4        A

2018  1        A
2018  2        A

I'm trying to assign number of quarter that would reference from current_date value.我正在尝试分配从current_date值中引用的季度数。 While Department dropes out from the table, quarter count remains unchanged by that scenario.虽然Department从表中退出,但在这种情况下,季度计数保持不变。

Year  Quarter  Department  Quarter_count
2017  1        A           12
2017  2        A           11
2017  3        A           10
2017  4        A           9

2018  1        A           8
2018  2        A           7
2018  3        A           6 THIS RECORD DOESN'T EXIST
2018  4        A           5 THIS RECORD DOESN'T EXIST

2019  1        A           4
2019  2        A           3
2019  3        A           2
2019  4        A           1

My starting code is:我的起始代码是:

SELECT Department, Year, Quarter,
       ROW_NUMBER() OVER (ORDER BY Year, Quarter ASC)

FROM TABLE_A
ORDER BY Depratment, Year, Quarter ASC

So this is rather simple math, there are four quarters per year, so difference of years times four, minus the quarters of the start year and add the quarters of the current date, plus one as we are not zero based..所以这是相当简单的数学,每年有四个季度,所以年差乘以四,减去开始年份的季度并加上当前日期的季度,再加上一个,因为我们不是从零开始的。

thus in expanded form:因此以扩展形式:

with table_a as (
SELECT column1 as year, column2 as Quarter, column3 as Department from values 
  (2017,1,'A'),(2017,2,'A'),(2017,3,'A'),(2017,4,'A')
  ,(2018,1,'A'),(2018,2,'A')
  --,(2018,3,'A'),(2018,4,'A')
  ,(2019,1,'A'),(2019,2,'A'),(2019,3,'A'),(2019,4,'A')
)
SELECT department, year, quarter
    ,YEAR(current_date) as cdy
    ,QUARTER(current_date) as cdq
    ,(cdy-year)*4 as year_diff_in_q
    ,year_diff_in_q - quarter + cdq + 1 as Quarter_count
FROM table_a
ORDER BY department, year, quarter ASC;

gives:给出:

DEPARTMENT  YEAR    QUARTER CDY CDQ YEAR_DIFF_IN_Q  QUARTER_COUNT
A   2017    1   2019    4   8   12
A   2017    2   2019    4   8   11
A   2017    3   2019    4   8   10
A   2017    4   2019    4   8   9
A   2018    1   2019    4   4   8
A   2018    2   2019    4   4   7
A   2019    1   2019    4   0   4
A   2019    2   2019    4   0   3
A   2019    3   2019    4   0   2
A   2019    4   2019    4   0   1

thus smaller:因此更小:

with table_a as (
SELECT column1 as year, column2 as Quarter, column3 as Department from values 
  (2017,1,'A'),(2017,2,'A'),(2017,3,'A'),(2017,4,'A')
  ,(2018,1,'A'),(2018,2,'A')
  --,(2018,3,'A'),(2018,4,'A')
  ,(2019,1,'A'),(2019,2,'A'),(2019,3,'A'),(2019,4,'A')
)
SELECT department, year, quarter
    ,((YEAR(current_date)-year)*4) - quarter + QUARTER(current_date) + 1 as Quarter_count
FROM table_a
ORDER BY department, year, quarter ASC;

giving:给予:

DEPARTMENT  YEAR    QUARTER QUARTER_COUNT
A   2017    1   12
A   2017    2   11
A   2017    3   10
A   2017    4   9
A   2018    1   8
A   2018    2   7
A   2019    1   4
A   2019    2   3
A   2019    3   2
A   2019    4   1

You seem to want:你似乎想要:

select d.department, y.yr, q.qtr,
       row_number() over (partition by d.department order by y.yr desc, q.qtr desc) as seqnum
from (select distinct department from t) d cross join
     (values (1), (2), (3), (4)) as q(qtr) cross join
     (values (2017), (2018), (2019)) as y(yr) left join
     t
     on t.department = d.department and
        t.year = y.yr and
        t.qtr = y.qtr

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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