如何查找按不同列排序的最后一个值
How to find the last value ordered by a different column
我有一个 table MyTable
有列:QuoteID, ControlNo, Premium, ExpirationDate
我需要创建一个度量来获取 SUM(Premium)
,EffectiveDate
应该是 <= Today()
,最后一个 ExpirationDate
(按 QuoteID DESC
排序)应该成为 >= Today()
.
如何将以下语句转换为 DAX?
在SQL,我会这样做:
select sum(Premium) as Premium
from MyTable t
where EffectiveDate <= GETDATE() and
(select top 1 t2.ExpirationDate
from MyTable t2
where t2.ControlNo = t.controlno
order by t.quoteid desc) >= GETDATE()
如何在 DAX 中写入?
我已经试过了,但它不能正常工作:
Premium =
CALCULATE (
SUM ( fact_Premium[Premium] ),
FILTER (
fact_Premium,
fact_Premium[EffectiveDate] <= TODAY () &&
TOPN ( 1, ALL ( fact_Premium[ExpirationDate] ),
fact_Premium[QuoteID], ASC ) >= TODAY ()
)
)
更新:
正在尝试从 fact_Premium 数据集创建计算 table,但仍不确定如何过滤它
In_Force Premium =
FILTER(
ADDCOLUMNS(
SUMMARIZE(
//Grouping necessary columns
fact_Premium,
fact_Premium[QuoteID],
fact_Premium[Division],
fact_Premium[Office],
dim_Company[CompanyGUID],
fact_Premium[LineGUID],
fact_Premium[ProducerGUID],
fact_Premium[StateID],
fact_Premium[ExpirationDate]
),
"Premium", CALCULATE(
SUM(fact_Premium[Premium])
),
"ControlNo", CALCULATE(
DISTINCTCOUNT(fact_Premium[ControlNo])
)
), // Here I need to make sure TODAY() falls between fact_Premium[EffectiveDate] and (SELECT TOP 1 fact_Premium[ExpirationDate] ORDE BY QuoteID DESC)
)
这里的 DAX 有几个问题。
首先,当您使用 TOPN
时,您的排序表达式(第三个参数)只能引用您正在操作的 table 中的行(第二个参数),因此只能使用 [ExpirationDate]
列将不起作用。我想你可能想要 fact_Premium
而不是 ALL ( fact_Premium[ExpirationDate] )
.
其次,TOPN
函数 returns 一个 table 而不是单个值,因此您需要以某种方式访问您想要的列。一种选择是使用像 SUMX
或 MAXX
:
这样的迭代器
MAXX( TOPN(...), fact_Premium[ExpirationDate] )
您也可以使用 SELECTCOLUMNS
将单行单列 table 强制为一个值:
SELECTCOLUMNS( TOPN(...), "ExpirationDate", fact_Premium[ExpirationDate] )
我不能保证这会完美运行,但它应该能让你更接近你的目标:
Premium =
CALCULATE (
SUM ( fact_Premium[Premium] ),
FILTER (
fact_Premium,
fact_Premium[EffectiveDate] <= TODAY () &&
SUMX( TOPN ( 1, fact_Premium, fact_Premium[QuoteID], DESC ),
fact_Premium[ExpirationDate] )
>= TODAY ()
)
)
我有一个 table MyTable
有列:QuoteID, ControlNo, Premium, ExpirationDate
我需要创建一个度量来获取 SUM(Premium)
,EffectiveDate
应该是 <= Today()
,最后一个 ExpirationDate
(按 QuoteID DESC
排序)应该成为 >= Today()
.
如何将以下语句转换为 DAX?
在SQL,我会这样做:
select sum(Premium) as Premium
from MyTable t
where EffectiveDate <= GETDATE() and
(select top 1 t2.ExpirationDate
from MyTable t2
where t2.ControlNo = t.controlno
order by t.quoteid desc) >= GETDATE()
如何在 DAX 中写入?
我已经试过了,但它不能正常工作:
Premium =
CALCULATE (
SUM ( fact_Premium[Premium] ),
FILTER (
fact_Premium,
fact_Premium[EffectiveDate] <= TODAY () &&
TOPN ( 1, ALL ( fact_Premium[ExpirationDate] ),
fact_Premium[QuoteID], ASC ) >= TODAY ()
)
)
更新:
正在尝试从 fact_Premium 数据集创建计算 table,但仍不确定如何过滤它
In_Force Premium =
FILTER(
ADDCOLUMNS(
SUMMARIZE(
//Grouping necessary columns
fact_Premium,
fact_Premium[QuoteID],
fact_Premium[Division],
fact_Premium[Office],
dim_Company[CompanyGUID],
fact_Premium[LineGUID],
fact_Premium[ProducerGUID],
fact_Premium[StateID],
fact_Premium[ExpirationDate]
),
"Premium", CALCULATE(
SUM(fact_Premium[Premium])
),
"ControlNo", CALCULATE(
DISTINCTCOUNT(fact_Premium[ControlNo])
)
), // Here I need to make sure TODAY() falls between fact_Premium[EffectiveDate] and (SELECT TOP 1 fact_Premium[ExpirationDate] ORDE BY QuoteID DESC)
)
这里的 DAX 有几个问题。
首先,当您使用 TOPN
时,您的排序表达式(第三个参数)只能引用您正在操作的 table 中的行(第二个参数),因此只能使用 [ExpirationDate]
列将不起作用。我想你可能想要 fact_Premium
而不是 ALL ( fact_Premium[ExpirationDate] )
.
其次,TOPN
函数 returns 一个 table 而不是单个值,因此您需要以某种方式访问您想要的列。一种选择是使用像 SUMX
或 MAXX
:
MAXX( TOPN(...), fact_Premium[ExpirationDate] )
您也可以使用 SELECTCOLUMNS
将单行单列 table 强制为一个值:
SELECTCOLUMNS( TOPN(...), "ExpirationDate", fact_Premium[ExpirationDate] )
我不能保证这会完美运行,但它应该能让你更接近你的目标:
Premium =
CALCULATE (
SUM ( fact_Premium[Premium] ),
FILTER (
fact_Premium,
fact_Premium[EffectiveDate] <= TODAY () &&
SUMX( TOPN ( 1, fact_Premium, fact_Premium[QuoteID], DESC ),
fact_Premium[ExpirationDate] )
>= TODAY ()
)
)