我有一些包含付款数据的表格,我们需要确定哪些付款是最新的,哪些是最旧的(由付款人员划分,以及付款类型)
我们假设实现这一目标的最佳方法是使用计算列和RANKX - 但是,当我们执行重新计算时,服务器会耗尽内存 - 原因是计算列。
部分原因是我所指的表格中的记录数量(约10mil)
可能更容易看到一些模拟的例子 - 在下表中,' RANK'列是我们预期的输出。我们想要实现的是通过PersonRef和ElementID对记录进行分组 - 然后按EndDate排序 - 具有LATEST EndDate的记录的RANK为1。
+-----------+-----------+------------+------+ | PersonRef | ElementId | EndDate | RANK | +-----------+-----------+------------+------+ | 123456 | 1000 | NULL | 1 | | 123456 | 1000 | 01/01/2017 | 2 | | 123456 | 6010 | 31/03/2018 | 1 | | 123456 | 6010 | 12/01/2018 | 2 | | 789789 | 999 | NULL | 1 | | 789789 | 999 | 25/02/2018 | 2 | | 789789 | 999 | 01/03/2016 | 3 | | 789789 | 1000 | 25/02/2018 | 1 | | 789789 | 1000 | 01/03/2016 | 2 | +-----------+-----------+------------+------+
我们也无法在我们的SQL表中真正做到这一点,因为SSAS表是分区的,我们每5分钟只处理一次相关分区 - 如果在第1级有新条目,我们将不得不改变该人的SQL记录,这将导致所有SSAS分区被处理,这对我们来说效率太低。
我们尝试将其作为计算列,并且它的内存使用率非常高:
VAR CurrentPersonRef = 'Payment'[Person_Ref]
VAR CurrentPayElement = 'Payment'[ElementId]
RETURN
RANKX
(
FILTER
(
'Payment',
'Payment'[Person_Ref]= CurrentPersonRef &&
'Payment'[ElementId] = CurrentPayElement
),
IF(ISBLANK('Payment'[Pay End Date]),"2999-01-01",'Payment'[Pay End Date]), , ASC, DENSE
)
任何其他建议将不胜感激!
答案 0 :(得分:1)
I'm not positive that this will give better performance, but give it a try:
Ranked =
VAR EndDate = Payment[AdjEndDate]
RETURN CALCULATE(
RANK.EQ(EndDate, Payment[AdjEndDate], DESC),
ALLEXCEPT(Payment, Payment[Person_Ref], Payment[ElementId]))
Where Payment[AdjEndDate]
is a column that replaces the null values:
AdjEndDate = IF(ISBLANK(Payment[Pay End Date]), DATE(2999,1,1), Payment[Pay End Date])