如何将当前月份的值与过去 12 个月进行比较

  • 本文关键字:过去 比较 sql sql-server
  • 更新时间 :
  • 英文 :


我正在尝试将当前月份的值与过去 12 个月的值进行比较。

E.g:
6/30/2019 100
5/31/2019 90
4/30/2019 80
3/31/2019 70
2/8/2019 60
1/31/2019 50
12/31/2018 40
11/30/2018 30
10/31/2018 20
9/30/2018 10
8/31/2018 90
7/30/2018 110

现在当前月份值(6/30/2019(在100中,那么我想将这些值与过去12个月的值进行比较。如果当前月份值是与 12 个月相比的最大值,那么我想将标志设置为"max"。在上面的例子中,110 是最大值,但当前月份为 100,即与过去 12 个月的值相比,它是最小的值,然后我想将标志设置为"min"。

另外,我还想获取日期,即,如果它是最小的,那么日期的最大值是多少(预期输出"MIN(110 截至 7 年 30 月 2018 日("(。

请为我提供任何解决方案来实现此方案

预期输出"MIN(110 截至 2018 年 7 月 30 日(">

如果要将当前值与滚动的 12 个月最小值/最大值进行比较,可以使用窗口函数:

select top (1) t.*,
       (case when value = max12_value then 'MAX'
             when value = min12_value then 'MIN'
        end) as flag
from (select t.*,
             max(value) over (order by date rows between 11 preceding and current row) as max12_value,
             min(value) over (order by date rows between 11 preceding and current row) as min12_value,
      from t
     ) t
order by date desc

如果我理解正确,这里有一种方法可以做到这一点:

-- Create a table variable to hold the sample data
DECLARE @data TABLE (
    [Date] DATE,
    [Value] INT
)
-- Load the sample data table
DECLARE @i INT = 0;
WHILE @i < 12
BEGIN
    INSERT INTO @data ([Date], [Value]) values (EOMONTH(DATEADD(M,-@i, GETDATE())), FLOOR(RAND()*(100-1+1))+10);
    SET @i = @i + 1;
END;
-- Select the resulting data set with flags
WITH t as
(
SELECT [Date], [Value], 
    CASE 
        WHEN [Value] = (SELECT MAX([Value]) FROM @data) THEN 'MAX' 
        WHEN [Value] = (SELECT MIN([Value]) FROM @data) THEN 'MIN' 
        ELSE '' 
    END AS Flag 
FROM @data
)
SELECT 'MAX(' + CAST([Value] as VARCHAR(MAX)) + ' as on ' + CAST([Date] as VARCHAR(MAX)) + ')' FROM t WHERE [Flag] = 'MAX'

这将输出:

MAX(109 as on 2018-09-30)

将"MIN"换成"MAX",您将获得最小值。

以下脚本将为您提供输出,考虑到始终从 GETDATE(( 计算的当前月份值

WITH CTE (d, value)
AS
(
    SELECT id,value FROM your_table
),
CTE2
AS
(
    SELECT DISTINCT
    (SELECT Value FROM CTE WHERE d>= CAST(DATEADD(DD,-DATEPART(DD,GETDATE()) + 1,GETDATE())  AS DATE)) current_month_value,
    MIN(value) min_value,
    MAX(value) max_value
    FROM CTE
    WHERE d <  CAST(DATEADD(DD,-DATEPART(DD,GETDATE()) + 1,GETDATE())  AS DATE)
    AND d >= CAST(DATEADD(MM,-13,DATEADD(DD,-DATEPART(DD,GETDATE()) + 1,GETDATE()) ) AS DATE)
)
SELECT 
CASE 
    WHEN  current_month_value > max_value THEN 'MAX'
    ELSE 'MIN(' + CAST(max_value AS VARCHAR)+ ' AS ON '+ (SELECT TOP 1 CAST(d AS VARCHAR) FROM CTE WHERE Value = max_value)+ ')'
END
FROM CTE2

最新更新