按上个月至本月的前N个变化过滤

时间:2019-01-24 22:29:57

标签: sql sql-server tableau

我有一个零件,每个零件价格和月份的数据集。我正在通过与SQL Server数据库的实时连接访问此数据。该数据库每月更新,每个部分的新价格。我想做的是绘制价格在过去一个月中变化最大的十个部分的一年价格数据(以上个月价格的百分比或美元的总变化为单位)。

由于我的数据库连接处于活动状态,因此理想情况下,Tableau将每月获取新的价格数据,以更新价格在新期间变化的前十个零件。我不想手动更改月份或使用存储过程。

part   price      date
110    167.66     2018-12-01 00:00:00.000
113    157.82     2018-12-01 00:00:00.000
121    99.16      2018-12-01 00:00:00.000
133    109.82     2018-12-01 00:00:00.000
137    178.66     2018-12-01 00:00:00.000
138    154.99     2018-12-01 00:00:00.000
143    67.32      2018-12-01 00:00:00.000
149    103.82     2018-12-01 00:00:00.000
113    167.34     2018-11-01 00:00:00.000
121    88.37      2018-11-01 00:00:00.000
133    264.02     2018-11-01 00:00:00.000

4 个答案:

答案 0 :(得分:1)

  1. 创建一个名为“ Recent_Price”的计算字段,作为 if DateDiff(‘month’, [date], Today()) <= 1 then [price] end。这将返回最近记录的价格,而对于较早的记录将返回null。您可能需要根据详细信息调整条件,或者使用LOD calc始终获取最后2个值,而与今天的日期无关。
  2. 创建一个名为Price_Change为Max([Recent_Price]) - Min([Recent_Price])的计算字段,请注意,您不能由此看出变化是正还是负,仅是其大小。
  3. 确保零件是离散尺寸。将其拖动到过滤器架。设置过滤条件,以按Price_Change
  4. 显示前N个部分

不难将其扩展为在价格变化中包含符号,或将其转换为百分比。提示,您可能需要一对步骤1中的计算来选择特定月份的价格

答案 1 :(得分:0)

您尚未提供任何示例数据,但可以遵循以下步骤

;WITH top_parts AS (
    -- select the top 10 parts based on some criteria
    SELECT TOP 10 parts.[id], parts.[name] FROM parts
    ORDER BY <most changed>
)
SELECT price.[date], p.[name], price.[price] FROM top_parts p
INNER JOIN part_price price ON p.[id] = price.[part_id]
ORDER BY price.[date]
  1. 使用CTE来获取最重要的部分。
  2. 从CTE中选择,然后加入价格表以获取每个零件的价格。
  3. 订购价格或将价格分类为几个月。
  4. 将其输入到您的图形中。

答案 2 :(得分:0)

这样的事情只持续了一个月。如果您需要整个年度,则必须明确指定要查看的内容:

;WITH cte as (
    SELECT TOP 10 m0.Part
        , Diff = ABS(m0.Price - m1.Price)
        , DiffPrc = ABS(m0.Price - m1.Price) / m1.Price
    FROM Parts as m0
    INNER JOIN (SELECT MaxDate = MAX([Date] FROM Parts) as md
        ON md.MaxDate = m0.[Date]
    INNER JOIN Parts as m1 ON m0.Part = m1.Part and DATEADD(MONTH,-1,md.MaxDate) = m1.[Date]
    ORDER BY ABS(m0.Price - m1.Price) DESC
    -- Top 10 by percentage:
    -- ORDER BY ABS(m0.Price - m1.Price) / m1.Price DESC
)
SELECT * FROM Parts as p
INNER JOIN cte ON cte.Part = p.Part

答案 3 :(得分:0)

-- Input from user,you decide in which format last month date will be pass
-- In other words , @InputLastMonth  is parameter of proc
--Suppose it pass in yyyy-MM-dd manner
Declare @InputLastMonth date='2018-12-31'

-- to get last one year data
--Declare local variable which is not pass
declare @From date= dateadd(day,1,dateadd(month,-12, @InputLastMonth))
Declare @TopN int=10-- requirement

-选择@ InputLastMonth,@ From

Select TOP (@TopN) parts,ChangePrice
(
select parts,ABS(max(price)-min(price)) as ChangePrice
from dbo.Table1
where dates>=@From and dates<=@InputLastMonth
group by parts
)t4
order by ChangePrice desc

通过最大的变化,我了解到,假设有一个零件“ Part1”在第一个月的价格为100,而在最后一个月的价格为1000。 另一方面,Part2在同一时期内多次更改,但最终更改仅为12。

换句话说,Part1仅更改了两次,但更改差异很大,Part2更改了几次,但更改差异很小。

因此,首选Part1。

第二件事是变化既可以是积极的,也可以是消极的。

如果我不理解您的要求,请纠正我。