Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

Reply
latheesh89
Helper II
Helper II

Necesita ayuda para mejorar el rendimiento de DAX Measure

Hola Techies,

Estoy tratando de crear una medida de duración de estancia para los pacientes. La fecha de inicio debe ser la fecha de admisión más reciente/máxima y la fecha de finalización debe basarse en la fecha de segmentación (fecha de estancia).

Aquí está mi ejemplo de datos de la tabla de pacientes,

PatientIDFecha de estanciaFecha de admisiónFecha de descargaEn casa díasBreve descanso
10001-01-2020 01-01-2020 1
10002-01-2020 01-01-202002-01-20200
10003-01-2020 03-01-2020 1
10004-01-2020 03-01-2020 1
10005-01-2020 03-01-2020 1
10006-01-2020 03-01-2020 01
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10021-12-2020 05-01-2020 1

La tabla de pacientes anterior es un hecho (tabla grande) que tiene millones de registros.

Tengo una dimensión de fecha independiente para La fecha de estancia y he usado lo mismo que una segmentación en mi informe. Digamos que selecciono Dec-2020 de la fecha de la estancia [Año del mes] entonces mi fecha de finalización debe ser 31-12-2020 y la fecha de inicio debe ser la última fecha de admisión, así que en nuestro caso es 03-01-2020

Puedo calcular LOS basado en días en casa sólo porque un paciente puede ir en descansos cortos y volver en cualquier momento. Así que no puedo calcualte LOS basado en just datediff.

He escrito el cálculo DAX como abajo,


Los Días: .
VAR MinDate - CALCULATE(MAX('Patient'[Admission Date]), ALL('Patient'[Stay Date]))
VAR MaxDateTM MAX('Fechas de estancia'[Fecha de estancia])
Resultado del VAR: CALCULATE( SUM([InHouse Day]), FILTER(ALL('Stay Dates'),'Stay Dates'[Stay Date]>' MinDate && 'Stay Dates'[Stay Date]<- MaxDate))
devolución
Resultado


Esto funciona de la manera que espero, pero el rendimiento es muy pobre. Cuando intento segmentar esta medida por cualquier dimensión, tarda más de un minuto en devolver los resultados.

Estoy seguro de que esto se puede reescribir de una manera optimizada para que se ejecute mucho más rápido.

Por favor, ayúdame.

Gracias

Latheesh

8 REPLIES 8
AlB
Super User
Super User

@latheesh89

No entiendo por qué MinDate se calcula con un MAX( ) y en 'Pacientes'

Difícil de decir sin el archivo real, pero darles una oportunidad:

LOS Days =
VAR MinDate =
    CALCULATE ( MAX ( 'Patient'[Admission Date] ), ALL ( 'Patient'[Stay Date] ) )
VAR MaxDate =
    MAX ( 'Stay Dates'[Stay Date] )
VAR Result =
    CALCULATE (
        SUM ( [InHouse Day] ),
        'Stay Dates'[Stay Date] >= MinDate,
        'Stay Dates'[Stay Date] <= MaxDate,
        ALL ( 'Stay Dates' )
    )
RETURN
    Result

Los dos siguientes suponen que 'Fecha de estancia' es una tabla de fechas bien formada:

LOS Days =
VAR MinDate =
    CALCULATE ( MAX ( 'Patient'[Admission Date] ), ALL ( 'Patient'[Stay Date] ) )
VAR MaxDate =
    MAX ( 'Stay Dates'[Stay Date] )
VAR Result =
    CALCULATE (
        SUM ( [InHouse Day] ),
        DATESBETWEEN ( 'Stay Dates'[Stay Date], MinDate, MaxDate ),
        ALL ( 'Stay Dates' )
    )
RETURN
    Result

LOS Days =
VAR MinDate =
    CALCULATE ( MAX ( 'Patient'[Admission Date] ), ALL ( 'Patient'[Stay Date] ) )
VAR MaxDate =
    MAX ( 'Stay Dates'[Stay Date] )
VAR Result =
    CALCULATE (
        SUM ( [InHouse Day] ),
        DATESBETWEEN ( 'Stay Dates'[Stay Date], MinDate, MaxDate )
    )
RETURN
    Result

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

@AlB Probé la solución anterior, pero no hay ninguna mejora en el rendimiento

Greg_Deckler
Super User
Super User

@latheesh89 - Así que, sí se puede, usted podría hacerlo de esta manera, pero puede o no puede mejorar el rendimiento:

LOS Days:=
VAR MinDate = CALCULATE(MAX('Patient'[Admission Date]), ALL('Patient'[Stay Date]))
VAR MaxDate= MAX('Stay Dates'[Stay Date])
VAR __Table =  FILTER(ALL('Stay Dates'),'Stay Dates'[Stay Date]<= MaxDate)
VAR Result = SUMX(FILTER(__Table, 'Stay Dates'[Stay Date]>= MinDate),[InHouse Day])
RETURN
Result


Follow on LinkedIn
@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

@Greg_Deckler Probé la solución anterior, pero no hay ninguna mejora en el rendimiento

Greg_Deckler
Super User
Super User

@latheesh89 - Correcto, tienes un problema similar a los mensajes que incluí. Debe ver si hay una manera de filtrar la tabla más tal vez de forma incremental para que no esté realizando un análisis completo de la tabla. Así que tal vez intente usar ALLSELECTED frente a ALL, por ejemplo. Es muy difícil de decir con certeza porque no está seguro de cómo está utilizando esa medida (en qué contexto) por lo que algunos de los consejos estarían supeditados a eso. Pero sí, tiene razón en su evaluación de dónde se encuentra el problema de rendimiento y es un problema muy similar a lo que resolví en esos artículos.


Follow on LinkedIn
@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

@Greg_Deckler He intentado la función ALLSELECTED, pero resultó en una salida incorrecta. ¿Podemos reescribir de una manera diferente que filtra la tabla del paciente por la fecha máxima de admisión 1a y luego de nuevo filtrar que resulset por fecha de estancia ?

Greg_Deckler
Super User
Super User

@latheesh89 ¿Hay alguna forma de que pueda publicar el archivo PBIX? Estas cosas son notoriamente difíciles de solucionar y optimizar. Supongo que el problema de rendimiento es con su instrucción ALL en la variable Result. Sólo una suposición.

DAX de ajuste del rendimiento - Parte 1 - Comunidad de Microsoft Power BI

DAX de ajuste del rendimiento - Parte 2 - Comunidad de Microsoft Power BI


Follow on LinkedIn
@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

@Greg_Deckler ¡Gracias por responder!

Lo sentimos, el informe contiene información de PHI, por lo que no puedo publicarla aquí. Mi informe contiene información del paciente junto con la medida LOS y la fecha de admisión. Cuando elimino la fecha de admisión, el informe se ejecuta más rápido. Como sabio para otras dimensiones también.

Dudo que la parte resaltada a continuación donde tuve que buscar para mindal en la tabla de hechos que es enorme.

CALCULATE( SUM([InHouse Day]), FILTER(ALL('Stay Dates'),'Stay Dates'[Stay Date]>- MinDate && 'Stay Dates'[Stay Date]<- MaxDate))

Helpful resources

Announcements
July 2024 Power BI Update

Power BI Monthly Update - July 2024

Check out the July 2024 Power BI update to learn about new features.

PBI_Carousel_NL_June

Fabric Community Update - June 2024

Get the latest Fabric updates from Build 2024, key Skills Challenge voucher deadlines, top blogs, forum posts, and product ideas.

Top Solution Authors