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

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

¿Por qué mi filtro Cross Join /Join no funciona correctamente?

Hola

Intento obtener las fechas entre la fecha de inicio y la fecha de finalización. Así que encontré una manera de trabajar en eso, pero no está funcionando de la manera que quiero. De alguna manera está eliminando la mayoría de los eventos. Mi tabla original tiene 33 eventos, pero la tabla calculada solo tiene 13 eventos.

Creo que el problema es con el filtro de unión cruzada, e intentar cambiar la lógica, pero no funcionó.

¿Puede alguien por favor decirme cómo arreglar esto o hay alguna mejor manera de hacerlo? En última instancia, quiero todos los eventos, incluidos los eventos que tienen varios días.

Código -

ProDetail_CrossJoin = 
VAR temp =
    SELECTCOLUMNS(
            ProServ,
                "EventID", ProServ[EventID],
                "StartDate", ProServ[Start],
                "EndDate", ProServ[End]
    )

VAR vCalendar =
    CALENDAR(MINX(temp, [StartDate]), MAXX(temp, [EndDate]))

RETURN
    SELECTCOLUMNS(
        FILTER( CROSSJOIN(temp, vCalendar),
                [StartDate] <= [Date]
                    && [EndDate] >= [Date]
            ),
            "EventID", [EventID],
            "StartDate", [StartDate],
            "EndDate", [EndDate],
            "Detail", [Date]

    )

Archivo de ejemplo - https://drive.google.com/file/d/1qFOk0J4unwwQGsrtT5LJfIZfq98TtnwY/view?usp=sharing

Capture.JPG

Muchas gracias

1 ACCEPTED SOLUTION

Se adjunta una versión de trabajo.

ProDetail_CrossJoin = 
VAR cross = CROSSJOIN(
                      SUMMARIZE(ProServ,ProServ[EventID],ProServ[Event Name]),
                      CALENDAR(minx(ProServ,ProServ[Start]),maxx(ProServ,ProServ[End]))
)
var ename = ADDCOLUMNS(cross,"en",ProServ[Event Name],"dt",[Date])
var test = ADDCOLUMNS(ename,"Include",
                            var l=SELECTCOLUMNS(filter(ProServ,ProServ[Event Name]=[en]),"Incl",
                                      CONTAINS(CALENDAR(ProServ[Start],ProServ[End]),[Date],[dt]))
                            return sumx(l,if([Incl],1,0))
)
return filter(test,[Include]>0)

View solution in original post

7 REPLIES 7
Syndicate_Admin
Administrator
Administrator

¿Qué estás tratando de medir? ¿El número de días que estuviste ocupado con cada tema? ¿Las fechas mínimas y máximas que ocupaste con cada tema?

@lbendlin

Gracias por tomarse el tiempo para revisar mi publicación, todo lo que quiero es obtener los datos entre las fechas de inicio y finalización del tema y convertirlo en una columna de fecha. Vea el intervalo de fechas resaltado,

Capture.JPG

pero en mi archivo de muestra, me faltan tantos temas. Quiero ser mi resultado final como el anterior.

Cualquier ayuda sobre esto será altamente valorada. Una vez más, gracias

Ya veo. El primer problema es que cree un calendario genérico en lugar de calendarios basados en eventos.

ProDetail_CrossJoin = 
VAR temp = ADDCOLUMNS(ProServ,"Cal",CALENDAR([Start],[End])
...

El segundo problema es que no hay ninguna función UNIONX en DAX.

Lo que significa que su enfoque tiene más sentido, pero también es extremadamente costoso. Creo que un enfoque diferente será obtener una lista distinta de nombres de eventos, unirla con el calendario general y luego aplicar los filtros.

VAR cross = CROSSJOIN(
                      SUMMARIZE(ProServ,ProServ[EventID],ProServ[Event Name]),
                      CALENDAR(minx(ProServ,ProServ[Start]),maxx(ProServ,ProServ[End]))
)

El siguiente paso es marcar los días activos para cada identificador de evento, en todos los subaprocesos.

Se adjunta una versión de trabajo.

ProDetail_CrossJoin = 
VAR cross = CROSSJOIN(
                      SUMMARIZE(ProServ,ProServ[EventID],ProServ[Event Name]),
                      CALENDAR(minx(ProServ,ProServ[Start]),maxx(ProServ,ProServ[End]))
)
var ename = ADDCOLUMNS(cross,"en",ProServ[Event Name],"dt",[Date])
var test = ADDCOLUMNS(ename,"Include",
                            var l=SELECTCOLUMNS(filter(ProServ,ProServ[Event Name]=[en]),"Incl",
                                      CONTAINS(CALENDAR(ProServ[Start],ProServ[End]),[Date],[dt]))
                            return sumx(l,if([Incl],1,0))
)
return filter(test,[Include]>0)

@lbendlin

¡Usted señor es increíble! He estado revisando en línea durante una semana y media para encontrar una solución y probé su solución, está funcionando muy bien. Muchas gracias por su tiempo y ayuda. Realmente aprecié su ayuda.

Me alegra saber que funciona para usted. Tenga cuidado con la cardinalidad: puede funcionar mal para rangos de fechas más grandes y un mayor número de eventos.

Finalmente presenté una idea para la función UNIONX: gracias por empujarme al límite.

Idea de Microsoft · UNIONX (powerbi.com)

Gracias. No creo que vaya a ser un gran conjunto de datos, pero lo vigilaré. Una vez más, muchas gracias por la ayuda.

Helpful resources

Announcements
LearnSurvey

Fabric certifications survey

Certification feedback opportunity for the community.

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

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

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.