【问题标题】:Joining tertile to quarter SQL (4-month periods to 3-month periods)将三分位数加入季度 SQL(从 4 个月到 3 个月)
【发布时间】:2019-06-25 18:05:03
【问题描述】:

假设我们每年测量 3 次海龟的外观,以三分位数为单位(三个 4 个月的周期)。然后我们切换到季度(四个 3 个月的周期)。我想将今年的值与上一年的值进行比较。

感谢 Steve cmets 进行编辑。最初我用了错误的词来表示 4 个月的时间,称它为 trimester。 4 个月期间的正确词是tertile or quadrimester

+------+--------+------------+------------+----------+
| year | period |     d1     |     d2     | value_cy |
+------+--------+------------+------------+----------+
| 2018 | T1     | 2018-01-01 | 2018-04-01 |       10 |
| 2018 | T2     | 2018-05-01 | 2018-08-01 |       20 |
| 2018 | T3     | 2018-09-01 | 2018-12-01 |       30 |
| 2019 | Q1     | 2019-01-01 | 2019-03-01 |       18 |
| 2019 | Q2     | 2019-04-01 | 2019-06-01 |       16 |
| 2019 | Q3     | 2019-07-01 | 2019-09-01 |       14 |
| 2019 | Q4     | 2019-10-01 | 2019-12-01 |       12 |
+------+--------+------------+------------+----------+

这是期望的结果:

+------+--------+------------+------------+----------+----------+
| year | period |     d1     |     d2     | value_cy | value_py |
+------+--------+------------+------------+----------+----------+
| 2018 | T1     | 2018-01-01 | 2018-04-01 |       10 |          |
| 2018 | T2     | 2018-05-01 | 2018-08-01 |       20 |          |
| 2018 | T3     | 2018-09-01 | 2018-12-01 |       30 |          |
| 2019 | Q1     | 2019-01-01 | 2019-03-01 |       18 |      7.5 |
| 2019 | Q2     | 2019-04-01 | 2019-06-01 |       16 |     12.5 |
| 2019 | Q3     | 2019-07-01 | 2019-09-01 |       14 |     17.5 |
| 2019 | Q4     | 2019-10-01 | 2019-12-01 |       12 |     22.5 |
+------+--------+------------+------------+----------+----------+
where
    Q1=3/4 * T1
    Q2=1/4 * T1 + 1/2 * T2 

我的努力:

我想到的想法是一个中间表,它将时间段从三个月转换为几个月,然后再转换为季度。

+--------+-------+
| period | month |
+--------+-------+
| Q1     |     1 |
| Q1     |     2 |
| Q1     |     3 |
| Q2     |     4 |
| Q2     |     5 |
| Q2     |     6 |
| Q3     |     7 |
| Q3     |     8 |
| Q3     |     9 |
| Q4     |    10 |
| Q4     |    11 |
| Q4     |    12 |
| T1     |     1 |
| T1     |     2 |
| T1     |     3 |
| T1     |     4 |
| T2     |     5 |
| T2     |     6 |
| T2     |     7 |
| T2     |     8 |
| T3     |     9 |
| T3     |    10 |
| T3     |    11 |
| T3     |    12 |
+--------+-------+

但是我想知道它是否可以通过源表的两个自连接来完成,首先连接在最接近的可能日期相等或更早,第二个日期相等或相等或更晚。有了这两个日期及其与源日期的差异,我们可以计算结果。

【问题讨论】:

  • 你说你想比较今年和上一年。您希望以什么粒度级别进行比较?比较全年?按月?按季度?
  • 只是吹毛求疵,但您确实意识到 三个月 意味着三个月(即与 季度 同义)?
  • @Steve 是的,你是对的。谢谢。我将编辑我的问题。
  • @dfundako 在宿舍
  • +1 表示“三分位”这个词的一般含义是“任何事物的一部分,分为三部分”(参见四分位)。此外,对于“测量乌龟......三分位数”的意外喜剧!

标签: sql sql-server


【解决方案1】:

假设您不想在未来继续记录三个月的数据(即,这可以通过一次性操作来解决),并且您正在使用 SQL Server,您可以将您的三个月数据预处理为季度首先在同一个表中的数据,以使您的比较更容易。类似以下的内容会为您提供 Q1 和 Q2 值:

-- Q1 rows
INSERT INTO data_table (year, period, d1, d2, value_cy)
SELECT year, period, d1, d2, t1_component.value_cy FROM
(
    SELECT
        year,
        'Q1' AS period,
        CONCAT(year, '-01-01') AS d1,
        CONCAT(year, '-04-01') AS d2,
    FROM
        data_table
) main
CROSS APPLY
(
    SELECT 0.75 * value_cy AS value_cy
    FROM data_table
    WHERE year = main.year
    AND period = 'T1'
) t1_component;

-- Q2 rows
INSERT INTO data_table (year, period, d1, d2, value_cy)
SELECT year, period, d1, d2, t1_component.value_cy + t2_component.value_cy FROM
(
    SELECT
        year,
        'Q2' AS period,
        CONCAT(year, '-05-01') AS d1,
        CONCAT(year, '-08-01') AS d2,
    FROM
        data_table
) main
CROSS APPLY
(
    SELECT 0.25 * value_cy AS value_cy
    FROM data_table
    WHERE year = main.year
    AND period = 'T1'
) t1_component
CROSS APPLY
(
    SELECT 0.5 * value_cy AS value_cy
    FROM data_table
    WHERE year = main.year
    AND period = 'T2'
) t2_component;

您可以根据需要通过调整上述查询来获取 Q3 和 Q4 值。一旦您获得了季度格式的所有值,您就可以进行自我 JOIN 以将上一年的结果与当年的结果一起获得,尽管由于必须在计算值上进行 JOIN,这会很慢(尽管这可能适合您的需要) :

SELECT
    cy.year,
    cy.period,
    cy.d1,
    cy.d2,
    cy.value_cy,
    py.value_cy AS value_py
FROM data_table cy
INNER JOIN data_table py
    ON py.year-1 = cy.year
WHERE cy.period IN ('Q1', 'Q2', 'Q3', 'Q4')

或者,您可以查看PIVOT 运算符,它基本上转换列标题中的行值:

 SELECT period, [2019], [2018]
 FROM
     (SELECT period, year, value_cy FROM data_table WHERE period IN ('Q1', 'Q2', 'Q3', 'Q4')) AS src
 PIVOT
     (value_cy FOR year IN ([2019], [2018])
 AS pivotTable

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2021-05-26
    • 2020-07-12
    • 2019-04-10
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多