Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
6 years ago
Solved

Generar datos para cada día

Hola, tengo un sistema simple que almacena los siguientes datos:

FechaTerritorioConsultor
2/3/2020AS - Nueva InglaterraPaul
2/3/2020AS - Llanuras CentralesNick

Habrá filas agregadas al establo solo cuando se realice un cambio en los datos. Por ejemplo, si cambié el nombre de Consulant por territorio de Nueva Inglaterra el 2/5/2020:

FechaTerritorioConsultor
2/3/2020AS - Nueva InglaterraPaul
2/3/2020AS - Llanuras CentralesNick
2/5/2020AS - Nueva InglaterraRyan
2/5/2020AS - Llanuras CentralesNick

Dado que no hubo ningún cambio en 2/4/2020, no hay datos para esa fecha.

¿Hay alguna manera dentro de Power BI de que podamos aumentar/generar datos para estas fechas que faltan y para cada nuevo día?

Ejemplo: de 2/3 a 2/6

FechaTerritorioConsultor
2/3/2020AS - Nueva InglaterraPaul
2/3/2020AS - Llanuras CentralesNick
2/4/2020AS - Nueva InglaterraPaul
2/4/2020AS - Llanuras CentralesNick
2/5/2020AS - Nueva InglaterraRyan
2/5/2020AS - Llanuras CentralesNick
2/6/2020AS - Nueva InglaterraRyan
2/6/2020AS - Llanuras CentralesNick

¡Gracias!

  • Echa un vistazo a lo que he hecho en este archivo PBIX.

    Básicamente, hice esto:

    1. Divida en dos tablas, una para cada región. Estoy seguro de que hay una manera de hacer esto sin este paso, pero seguí obteniendo 1 récord para feb 4 para trabajar con, no dos, y después de media hora, tomé en batea e hice esto.
    2. Cada tabla secundaria sigue los siguientes pasos:
      1. Busque la primera y la última fecha y, a continuación, cree una lista de fechas de ese intervalo de fechas. Ahora tengo una tabla de todas las citas.
      2. fusionó esa tabla de nuevo en la tabla principal de esa región mediante la unión externa derecha: todos los registros de la 2a tabla (mi tabla de fechas) y los que coinciden desde la primera. Ahora conseguiré un registro en blanco que tiene el 4 de febrero.
      3. Reorganizó las columnas y ordenado por mi fecha.
      4. Lleno en el Territorio y Consultor.
    3. Se ha creado una nueva tabla final que es ambas tablas secundarias de territorio.

    Se ve así en Power Query:

    2020-03-12 20_09_19-.png

    Sólo lo hace desde la primera hasta la última fecha. Su ejemplo pasa por una fecha fizcana en el futuro. Puede lograr esto en mi consulta cambiando el paso "Latest calculado" de:

    • • List.Max("Filas filtradas"[Fecha])
    • Para
    • • Date.AddDays(List.Max("Filtered Rows"[Date]),1)

    O podría poner hoy allí con DateTime.Date(Date.TimeLocalNow()) y omitir la búsqueda de la última fecha.

4 Replies

  • edhans's avatar
    edhans
    Icon for Community Champion rankCommunity Champion

    Echa un vistazo a lo que he hecho en este archivo PBIX.

    Básicamente, hice esto:

    1. Divida en dos tablas, una para cada región. Estoy seguro de que hay una manera de hacer esto sin este paso, pero seguí obteniendo 1 récord para feb 4 para trabajar con, no dos, y después de media hora, tomé en batea e hice esto.
    2. Cada tabla secundaria sigue los siguientes pasos:
      1. Busque la primera y la última fecha y, a continuación, cree una lista de fechas de ese intervalo de fechas. Ahora tengo una tabla de todas las citas.
      2. fusionó esa tabla de nuevo en la tabla principal de esa región mediante la unión externa derecha: todos los registros de la 2a tabla (mi tabla de fechas) y los que coinciden desde la primera. Ahora conseguiré un registro en blanco que tiene el 4 de febrero.
      3. Reorganizó las columnas y ordenado por mi fecha.
      4. Lleno en el Territorio y Consultor.
    3. Se ha creado una nueva tabla final que es ambas tablas secundarias de territorio.

    Se ve así en Power Query:

    2020-03-12 20_09_19-.png

    Sólo lo hace desde la primera hasta la última fecha. Su ejemplo pasa por una fecha fizcana en el futuro. Puede lograr esto en mi consulta cambiando el paso "Latest calculado" de:

    • • List.Max("Filas filtradas"[Fecha])
    • Para
    • • Date.AddDays(List.Max("Filtered Rows"[Date]),1)

    O podría poner hoy allí con DateTime.Date(Date.TimeLocalNow()) y omitir la búsqueda de la última fecha.

    • edhans's avatar
      edhans
      Icon for Community Champion rankCommunity Champion

      Tuve otra idea. Esto no se prueba al 100%. Me siento mejor con mi solución anterior, pero esto hará todo en una consulta, pero debe probar para diferentes escenarios (algunas regiones no existen, por ejemplo.)

      No puedo cargar un nuevo archivo PBIX en este momento. Sin embargo, simplemente cree una nueva consulta en blanco, vaya al Editor avanzado, elimine todo y pegue esto en:

      let
          Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtI31jcyMDJQ0lFyDFbQVfBLLVdwzUvPScxLAQoFJJbmKMXqYCpzTs0rKUrMUQjISczMKwaK+mUmZytAlZriMTGoMjEPqzJcJsYCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Territory = _t, Consultant = _t]),
          #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Territory", type text}, {"Consultant", type text}}),
          #"Calculated Earliest" = List.Min(#"Changed Type"[Date]),
          #"Calculated Latest" = List.Max(#"Changed Type"[Date]),
          #"Full list of dates" = {Number.From(#"Calculated Earliest")..Number.From(#"Calculated Latest")},
          #"Table of Dates" = Table.FromList(#"Full list of dates", Splitter.SplitByNothing(), {"Date"}, null),
          #"Changed Type1" = Table.TransformColumnTypes(#"Table of Dates",{{"Date", type date}}),
          #"Cartesian Join to original table" = Table.AddColumn(#"Changed Type1", "Cartesian Join of full table", each #"Changed Type"),
          #"Expanded Cartesian Join of full table" = Table.ExpandTableColumn(#"Cartesian Join to original table", "Cartesian Join of full table", {"Date", "Territory", "Consultant"}, {"Date.1", "Territory", "Consultant"}),
          #"Added Is Match" = Table.AddColumn(#"Expanded Cartesian Join of full table", "Is Match", each [Date] = [Date.1]),
          #"Date 1" = #"Added Is Match"[Date.1],
          #"Unique Original Dates" = List.Distinct(#"Date 1"),
          #"Added In Original List" = Table.AddColumn(#"Added Is Match", "In Original List", each List.PositionOf(#"Unique Original Dates", [Date])),
          #"Added filter to remove unneeded items" = Table.AddColumn(#"Added In Original List", "Custom", each [Is Match] = true or [In Original List] = -1),
          #"Filtered out unneeded items" = Table.SelectRows(#"Added filter to remove unneeded items", each ([Custom] = true)),
          #"Added New Consultant" = Table.AddColumn(#"Filtered out unneeded items", "New Consultant", each if [In Original List] = -1 then null else [Consultant], type text),
          #"Removed Other Columns" = Table.SelectColumns(#"Added New Consultant",{"Date", "Territory", "New Consultant"}),
          #"Removed Duplicates" = Table.Distinct(#"Removed Other Columns"),
          #"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"Territory", Order.Ascending}, {"Date", Order.Ascending}}),
          #"Filled Down" = Table.FillDown(#"Sorted Rows",{"New Consultant"}),
          #"Renamed Columns" = Table.RenameColumns(#"Filled Down",{{"New Consultant", "Consultant"}})
      in
          #"Renamed Columns"


      No conseguimos encontrar tu ubicación exacta. Me golpeó esta mañana en mi auto en cómo hacer que eso suceda.

      • Anonymous's avatar
        Anonymous
        Not applicable

        @edhans gracias por esto! Traté de replicarlo, pero algo explotó. Tendrá una mirada más profunda.

        Tendré que crear datos para ver si este modelo puede abordar desafíos como agregar nuevos territorios en el futuro

        ¡Gracias por tu ayuda!

  • @sv12

    No es una gran manera. Pero si quieres todas las fechas para cada uno

    Create a new date table
    Date1= calendar(min(table[Date]),max(table[Date]))
    
    Create table with cross join
    table2 = crossjon(Date1,summarize(table,table[Territory],table[Consultant]))


    Aprecia tus Felicitaciones.