Starting December 3, join live sessions with database experts and the Microsoft product team to learn just how easy it is to get started
Learn moreGet certified in Microsoft Fabric—for free! For a limited time, get a free DP-600 exam voucher to use by the end of 2024. Register now
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,
PatientID | Fecha de estancia | Fecha de admisión | Fecha de descarga | En casa días | Breve descanso |
100 | 01-01-2020 | 01-01-2020 | 1 | ||
100 | 02-01-2020 | 01-01-2020 | 02-01-2020 | 0 | |
100 | 03-01-2020 | 03-01-2020 | 1 | ||
100 | 04-01-2020 | 03-01-2020 | 1 | ||
100 | 05-01-2020 | 03-01-2020 | 1 | ||
100 | 06-01-2020 | 03-01-2020 | 0 | 1 | |
. . . | . . . | . . . | . . . | . . . | |
100 | 21-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
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
@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
@Greg_Deckler Probé la solución anterior, pero no hay ninguna mejora en el rendimiento
@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.
@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 ?
@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
@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))
Starting December 3, join live sessions with database experts and the Fabric product team to learn just how easy it is to get started.
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early Bird pricing ends December 9th.