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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Seleccione tres columnas diferentes usando la medida

Hola a todos,

Estoy estudiando medidas a través de un ranking top 500 de rock clásico que encontré en Kaggle.

Para mi propósito, tengo la intención de seleccionar tres columnas diferentes: Música, YearRanking, Top500.

La música contiene toda la música de esta base de datos;

YearRanking contiene todos los años, de 2015 a 2022, en que se aplicó la entrevista;

Top500 contiene un ranking que va de 0 a 500, donde 0 significa que nadie calificó esa canción y 500 significa que esta canción fue calificada, pero está en la última posición.

Ok, entonces el problema al que me enfrento es:

Quiero filtrar estas 3 columnas para encontrar las 5 canciones más valoradas, del 1 al 5, donde TODAS estas canciones deben estar presentes en 2015, 2016, 2017, 2018, 2019, 2020, 2021 Y 2022.

¿Cómo puedo resolver eso?

Traté de acercarme lo más que pude, usando esta medida:

TopMusic = CALCULATE(COUNTROWS(classic_rock_playlist), classic_rock_playlist[Top500]<>0, classic_rock_playlist]<6)

Pero cuando uso esto como solución, la lógica aplicada aquí es: Encuentra las canciones que se clasifican del 1 al 5 en cualquier año de 2015 a 2022.

Pero lo que quiero es encontrar las canciones que se clasifican del 1 al 5 en todos los años.

Gracias de antemano.

14 REPLIES 14
Syndicate_Admin
Administrator
Administrator

@DanielaAmadeuPr Estoy pensando algo como esto:

Measure =
  VAR __Table = 
    SUMMARIZE(
      FILTER('classic_rock_playlist',[Top500]>0 && [Top500]<6)
      [YearRanking],
      [Music]
    )
  VAR __NumYears = COUNTROWS(DISTINCT('classic_rock_playlist'[YearRanking]))
  VAR __Table1 = 
    ADDCOLUMNS(
      __Table,
      "__NumYears" = 
          VAR __Music = [Music]
          VAR __Result = COUNTROWS(FILTER(__Table,[Music] = __Music))
        RETURN
          __Result
    )
  VAR __Result = COUNTROWS(FILTER(__Table1, [__NumYears] = __NumYears))
RETURN
  __Result

Hola, @Greg_Deckler
En primer lugar, gracias por ayudarme.
Probé su código como una solución, pero solo está filtrando las músicas que hay en algunos de los años.

Aquí está su código:

TopMusic = 
VAR __Table = 
    SUMMARIZE(
      FILTER('classic_rock_playlist',[Top500]<>0 && [Top500]<6),
      [YearRanking],
      [Music]
    )
  VAR __NumYears = COUNTROWS(DISTINCT('classic_rock_playlist'[YearRanking]))
  VAR __Table1 = 
    ADDCOLUMNS(__Table, "NumYears", 
    VAR __Music = [Music]
    VAR __Result = COUNTROWS(FILTER(__Table,[Music] = __Music))
        RETURN
          __Result
    )
  VAR __Result = COUNTROWS(FILTER(__Table1, __NumYears = __NumYears))
RETURN
  __Result


Y aquí está el gráfico de barras:
sample.png

Como puede ver en la barra púrpura, es un valor que ocurre solo en 2022, pero está presente cuando no debería estar presente.

😞

@DanielaAmadeuPr Sí, una especie de ciego volador sin el conjunto de datos, ¿es este?

Classic Rock - Top 500 canciones | Kaggle

Si no es así, ¿qué conjunto de datos está utilizando?

¡Sí!

@DanielaAmadeuPr OK, aquí tienes. PBIX se adjunta debajo de la firma.

TopMusic = 
VAR __Table = 
    SUMMARIZE(
      FILTER('classic_rock_playlist',[Top500]<>0 && [Top500]<6),
      [YearRanking],
      [Music]
    )
  VAR __NumYears = COUNTROWS(DISTINCT('classic_rock_playlist'[YearRanking]))
  VAR __Table1 = 
    ADDCOLUMNS(__Table, "__NumYears", 
    VAR __Music = [Music]
    VAR __Result = COUNTROWS(FILTER(__Table,[Music] = __Music))
        RETURN
          __Result
    )
  VAR __Result = COUNTROWS(DISTINCT(SELECTCOLUMNS(FILTER(__Table1, [__NumYears] = __NumYears),"__Music",[Music])))
RETURN
  __Result

Hola, @Greg_Deckler

Disculpas por el retraso.
Volví a estudiar el problema y me acerqué mucho a la solución. Mi único impedimento ha sido reemplazar SELECTEDVALUE por otra medida que se ajuste mejor.

Aquí está mi nueva medida:

TopMusic =
CALCULAR(VALOR SELECCIONADO(classic_rock_playlist[Top500]), classic_rock_playlist[Top500]<6 ,classic_rock_playlist[YearRanking]="2015")
El resultado:
classicrock.png
Como puede ver, si un valor está presente en Top500, se repite en todos los años siguientes. Pero solo hay tres Top500 que se repiten en los años siguientes. Así que realmente creo que mi problema es el valor SELECTED, porque devuelve solo un valor.

@DanielaAmadeuPr No creo que SELECTEDVALUE sea su problema. Consulte el archivo PBIX actualizado que presenta su objeto visual. PBIX se adjunta debajo de la firma.

Greg_Deckler_0-1675022431351.png

@Greg_Deckler Ya veo.
Ok, funciona mejor. Pero como principiante, ¿hay una manera más fácil de resolver eso?

Puedo estudiar esta solución, por supuesto, pero mi idea inicial era ser capaz de resolver esta tarea de una manera que pueda entender.

Si no es posible, puedo manejar eso. La solución que propusiste es increíble y la voy a estudiar.

Gracias por ser tan paciente.

@DanielaAmadeuPr No es un problema trivial de resolver. Su cláusula de filtro es el problema con su CALCULATE y realmente no debería usar CALCULATE como principiante. CALCULATE es una función increíblemente compleja. Con su cláusula de filtro siempre va a estar en la posición de obtener música que aparece en el top 5 durante uno o más años, pero no todos los años. Ese es el problema que tienes que resolver. Entonces, para explicar el código:

TopMusicTable = 
/*
First, get a table for all music that appears in the top 5 and group that by Year and a unique Key in this case since there are multiple songs named One. The Key is simply a concatenation of artist and music with a | character in between. Use TOCSV(__Table) in the RETURN to visualize the table that is returned. You can use a Card visual for this.
*/
  VAR __Table = 
    SUMMARIZE(
      FILTER('classic_rock_playlist',[Top500]<>0 && [Top500]<6),
      [YearRanking],
      [Key]
    )
/*
This simply counts the distinct Year values so now you know how many years you are dealing with
*/
  VAR __NumYears = COUNTROWS(DISTINCT('classic_rock_playlist'[YearRanking]))
/*
/*
Next, we add a column called __NumYears to our base table. This column calculates how times that music appears in the base table (__Table). It does this by getting the Key adn then counting the rows in the base table where the Key matches. Again, use TOCSV(__Table1) as the RETURN value to visualize this table in a Card visual for example.
*/
  VAR __Table1 = 
    ADDCOLUMNS(__Table, "__NumYears", 
    VAR __Music = [Key]
    VAR __Result = COUNTROWS(FILTER(__Table,[Key] = __Music))
        RETURN
          __Result
    )
/*
Now all we have to do is to filter the table with the additional column (__Table1) where the __NumYears column matches our __NumYears VAR that we created, meaning that the song appeared in all years because they match. We only want the key column as a return value so we use SELEECTCOLUMNS for that and just we only want distinct values so we use DISTINCT as well.
*/
  VAR __Result = DISTINCT(SELECTCOLUMNS(FILTER(__Table1, [__NumYears] = __NumYears),"Key",[Key]))
RETURN
  __Result

Muchas gracias por explicar incluso los pequeños detalles. Seguiré estudiando DAX y CALCULAR aún más.

Hola, @Greg_Deckler

Gracias de nuevo por ayudarme.

Los requisitos son:
Los valores del ranking deben ser del 1 al 5;
Las canciones que son del 1 al 5 deben estar presentes en todos los años desde 2015 hasta 2022.
Solo hay tres canciones que siguen esas reglas:
Escalera al cielo, Uno y Bohemian Rhapsody.

Gracias de nuevo!!!

@DanielaAmadeuPr Correcto, el archivo PBIX hace exactamente eso y sale con una respuesta de 3. Incluso puede revisar la medida para CONCATENATEX para que recupere las canciones reales. Aquí está la versión de CONCATENATEX:

TopMusic2 = 
VAR __Table = 
    SUMMARIZE(
      FILTER('classic_rock_playlist',[Top500]<>0 && [Top500]<6),
      [YearRanking],
      [Music]
    )
  VAR __NumYears = COUNTROWS(DISTINCT('classic_rock_playlist'[YearRanking]))
  VAR __Table1 = 
    ADDCOLUMNS(__Table, "__NumYears", 
    VAR __Music = [Music]
    VAR __Result = COUNTROWS(FILTER(__Table,[Music] = __Music))
        RETURN
          __Result
    )
  VAR __Result = CONCATENATEX(DISTINCT(SELECTCOLUMNS(FILTER(__Table1, [__NumYears] = __NumYears),"__Music",[Music])),[__Music],",")
RETURN
  __Result

Greg_Deckler_0-1674424037830.png

Syndicate_Admin
Administrator
Administrator

@DanielaAmadeuPr

¿Qué contexto tiene para la medida?

Prueba como:

TopMusic = 
CALCULATE(
        COUNTROWS(classic_rock_playlist), 
        classic_rock_playlist[Top500]<>0, 
        classic_rock_playlist[Top500]<6,
        classic_rock_playlist[YearRanking]>=2015,
        classic_rock_playlist[YearRanking]<=2022
)

Hola @FreemanZ ,
Estaba intentando exactamente esto como una solución. Pero el retorno que obtengo es el mismo: puedo ver todas las músicas clasificadas del 1 al 5 que hay en un año u otro.

Gracias.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

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.