0

この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)
4

3 に答える 3

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: 3 回目の魅力ですか? サンプル出力の結果を取得するクエリを次に示します。重要なのは、セットが現在の日付の日付/ユーザーの組み合わせごとにタプルを生成し、それをインラインの名前付きセットとして、ランクによって一意に識別される可能な日付ごとに 1 つずつ生成する必要があることです。したがって、行の日付のリストを見ると、最初の日付 (1/3) はランク 1、2 番目の日付 (1/4) はランク 2 などです。最初の日付である 2001 年 1 月 3 日には、セットに 2 つの項目があります。1 つは Jim が 1/3 で、もう 1 つは Fred が 1/3 です。そのため、中央値の計算では、関連セット内の各項目の応答日数を使用する必要があります。1/3 はリストの日付のランク 1 であるため、RP1 と呼ばれるセットが取得され、セット内のアイテム (ジムとフレッド) の応答日数と組み合わされ、中央値が計算されます。そして次の日、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
于 2012-08-26T07:25:59.763 に答える
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]
于 2012-08-27T17:25:28.790 に答える
0

2 つの列 mtid、生産性を持つファクト テーブル fct_line_details があります。

  mtid     productivity
  ----     ------------
  1        400
  1        200
  1        600
  2        700
  3        900

SSAS の各 mtid の中央値を計算したい。(mtid 1=400 の中央値)

于 2015-05-28T09:52:36.933 に答える