真的可以在这个mdx查询中使用某人的手牌。我试图在每个用户和每天的基础上产生过去365天的滚动中位数。我需要将中位数作为每个用户响应天数的中位数。这似乎是一个简单的计算,但我无法看到如何使用混合中的交叉连接。任何帮助都会非常感激!如果你甚至有一个关于攻击方向的建议那就太好了。
SET [2Years] AS
'{[FirstOrderDate].[Full Date].&[2010-01-15T00:00:00]:[FirstOrderDate].[Full Date].[2012-08-20T00:00:00]}'
MEMBER [Measures].[2YearMedianLag]
AS
median({[FirstOrderDate].[Full Date].currentmember.lag(365):[FirstOrderDate].[FullDate].currentmember} , [Measures].[Response Days])
SELECT {[Measures].[Response Days], [Measures].[MedianLag]} ON 0,
NonEmpty(crossjoin( [days],
[User].[User ID].children),[Measures].[Response Days]) ON 1
FROM [UserRevenue]
提前感谢您的协助。
编辑:
SampleData (UserName varchar(100) null, FirstOrderDate Datetime null, ResponseDays int null)
('Jim', '2001-01-03', 10)
('Fred', '2001-01-03', 80)
('Frank', '2001-01-04', 30)
('Sally', '2001-01-05', 18)
('Joan', '2001-01-06', 26)
('Bill', '2001-01-06', 15)
('Ted', '2001-01-08', 29)
('Sam', '2001-01-10', 9)
('Jane', '2001-01-17', 200)
SampleOutput (FirstOrderDate datetime null, MedianResponseDays int null)
('2001-01-03', 45)
('2001-01-04', 30)
('2001-01-05', 24)
('2001-01-06', 22)
('2001-01-07', 22)
('2001-01-08', 26)
('2001-01-09', 26)
('2001-01-10', 22)
('2001-01-11', 22)
('2001-01-12', 22)
('2001-01-13', 22)
('2001-01-14', 22)
('2001-01-15', 22)
('2001-01-16', 22)
('2001-01-17', 26)
答案 0 :(得分:1)
这很棘手,因为您需要每天在行上使用不同的滚动日期集。你确定你想要延迟365吗?这给你1年加1天。无论如何,这种技术使用内联命名集为每个用户/日期组合创建一个命名集并为其分配一个唯一的数字,然后你可以在StrToSet函数中再次拉出该命名集以匹配当前行的用户和日期。此版本因素影响每个用户:
with
set Users as [User].[User ID].Children
set UsersDates as NonEmpty((Users, [FirstOrderDate].[Full Date].children), [Measures].[Response Days])
set [Rolling Period] as
Generate(
UsersDates,
StrToSet(
"{[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember} as RP" + CStr(UsersDates.CurrentOrdinal)
)
)
member [Measures].[Median Lag] as
median(
StrToSet("RP" +
CStr(Rank(([User].[User ID].CurrentMember, [FirstOrderDate].[Full Date].CurrentMember), UsersDates)))
, [Measures].[Response Days])
select
{
[measures].[Response Days]
, [measures].[Median Lag]
}
on columns,
UsersDates
on rows
from UserRevenue
更新#1:此版本忽略了单个用户,而是将所有用户的响应用于适用的日期集:
with
set Users as [User].[User ID].Children
set Dates as NonEmpty([FirstOrderDate].[Full Date].children, [Measures].[Response Days])
set [Rolling Period] as
Generate(
Dates,
StrToSet(
"{[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember} as RP"
+ CStr(Dates.CurrentOrdinal)
)
)
member [Measures].[Median Lag] as
median(
StrToSet("RP" +
CStr(Rank([FirstOrderDate].[Full Date].CurrentMember, Dates)))
, ([Measures].[Response Days], [User].[User ID].[All]))
select
{
[measures].[Response Days]
, [measures].[Median Lag]
}
on columns,
(Users, Dates)
on rows
from UserRevenue
更新#2:第三次是魅力?这是一个查询,可以在样本输出中获得结果。关键是集合需要为当前日期的每个日期/用户组合生成元组,并将其作为内联命名集存储,每个可能的日期一个由排名唯一标识。因此,当您查看行上的日期列表时,第一个日期(1/3)是等级1,第二个日期(1/4)是等级2等。第一个日期是1/3/2001,在集合中有两个项目 - 一个用吉姆用于1/3,一个用弗雷德用于1/3。因此,在中值计算中,需要使用相关集合中每个项目的响应天数。因为1/3在列表日期中排名为1,所以检索名为RP1的集合,并结合集合中项目的响应天数(Jim和Fred)并计算中位数。然后下一个日期,1/4,包含三个项目 - 与1/3相同,但现在也是Frank的1/4,因此需要重新计算中位数,依此类推。
with
set Users as [User].[User ID].Children
set Dates as [FirstOrderDate].[Full Date].children
set [Rolling Period] as
Generate(
Dates,
StrToSet(
"NonEmpty(({[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember}
, Users), [Measures].[Response Days]) as RP"
+ CStr(Dates.CurrentOrdinal)
)
)
member [Measures].[Median Lag] as
median(
StrToSet("RP" +
CStr(Rank([FirstOrderDate].[Full Date].CurrentMember, Dates)))
, [Measures].[Response Days])
select
{[measures].[Median Lag]}
on columns,
Dates
on rows
from UserRevenue
答案 1 :(得分:0)
MedianResponseDays
指标会迭代用户,以计算从给定日期到当前日期Response Days
的中位数值。我把365天。在行上。
WITH MEMBER [Measures].[MedianResponseDays] AS
Median([User].[User ID].children * [FirstOrderDate].[FullDate].CurrentMember:[FirstOrderDate].[FullDate].DefaultMember, [Measures].[Response Days])
SELECT {[Measures].[MedianResponseDays]} ON 0,
NON EMPTY {[FirstOrderDate].[Full Date].currentmember.lag(364):[FirstOrderDate].[FullDate].currentmember} ON 1
FROM [UserRevenue]
答案 2 :(得分:0)
我有一个事实表fct_line_details有两列mtid,生产力
mtid productivity
---- ------------
1 400
1 200
1 600
2 700
3 900
我想计算SSAS中每个mtid的中位数。 (mtid 1的中位数= 400)