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
jeronimo2334
Helper III
Helper III

Calcular tabla de fechas a partir de marcas de tiempo

Hola

Esperaba poder obtener alguna información sobre cómo lograr esto a través de DAX o SQL :

Tengo una tabla con 3 columnas: ids, longitudes y marcas de tiempo. Lo que estoy tratando de hacer es crear una nueva tabla que tenga id, número de semana, fecha. Para calcular la nueva tabla tomamos la marca de tiempo de la primera tabla y agregamos días iguales al número de longitud multiplicado por 7 porque cada longitud es una semana. La columna de la semana comienza en 1 de forma predeterminada y, a continuación, aumenta en función del número de longitud.

Lo sé, es un poco confuso, avísame si debo proporcionar más información.

Capture32312312123123.JPG

1 ACCEPTED SOLUTION

Sí. 🙂 En serio, @jeronimo2334, esto fue un verdadero desafío.

Así que pensé en eso. Creo que solo tienes que hacer una edición muy pequeña:

Table 2 = 
    VAR __Table =
        SUMMARIZE(
            'Table',
            'Table'[id],
            'Table'[weekLength],
            'Table'[firstDate],
            "__DateNum1",INT([firstDate])
        )
    VAR __Calendar = 
        ADDCOLUMNS(
            CALENDAR(
                DATE(2019,1,1),
                DATE(2021,12,31)
            ),
            "__Weeknum",WEEKNUM([Date],17),
            "__DateNum2",INT([Date]),
            "__Year",YEAR([Date])
        )
    VAR __GeneratedTable = 
            FILTER(
                GENERATE(__Table,__Calendar),
                [__DateNum2]>=[__DateNum1]
            )
    VAR __GeneratedTable2 = 
        ADDCOLUMNS(
            __GeneratedTable,
            "__Sequential",
                VAR MaxWeeks = SUMMARIZE(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year],"MaxWeek",MAXX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Weeknum]))
                VAR MyYear = [__Year]
                VAR MyStart = SUMX(FILTER(MaxWeeks,[__Year]<MyYear),[MaxWeek])
                VAR firstYear = MINX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year])
                VAR myNum = IF(MyYear=firstYear,[__Weeknum],MyStart+[__Weeknum])
                RETURN myNum
        )
    VAR __GeneratedTable3 = 
        ADDCOLUMNS(
            __GeneratedTable2,
            "__WeeksFromMin",
                [__Sequential] - MINX(FILTER(__GeneratedTable2,[id]=EARLIER([id])),[__Sequential]) + 1
        )
RETURN
    SELECTCOLUMNS(
        FILTER(
            __GeneratedTable3,
            [__WeeksFromMin] <= [weekLength]
        ),
        "id",[id],
        "date",[Date],
        "week",[__WeeksFromMin]
    )


@ 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...

View solution in original post

22 REPLIES 22
Shak85
Helper I
Helper I

Hola a todos, quiero crear una tabla de fechas en el siguiente formato. Si seleccionamos Semanalmente, todas las fechas se muestran con la semana que termina en la fecha excepto la última semana con "semana actual" igual para meses trimestre y año.

FechaPeríodo de tiempoIntervalo de tiempo
01/04/2020SemanalSemana actual (05-04-2020)
P/e 29/03/20220
con 22/03/2020
con 15/03/2020
MensualMes actual (abril)
Marzo
Febrero
Enero
TrimestralTrimestre actual (T1 2020)
Q4 2019
Tercer trimestre de 2019

Gracias

@Shak85 por favor cree un nuevo hilo para su pregunta. Este subproceso se ha marcado como resuelto y no puede tener dos soluciones a dos problemas diferentes.



Did I answer your question? Mark my post as a solution!
Did my answers help arrive at a solution? Give it a kudos by clicking the Thumbs Up!

DAX is for Analysis. Power Query is for Data Modeling


Proud to be a Super User!

MCSA: BI Reporting
Greg_Deckler
Super User
Super User

¿Esa es la tabla de origen o la tabla deseada? Por favor, consulte este post sobre cómo obtener su pregunta respondida rápidamente: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

¡Muestra datos como texto!


@ 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

Tengo esto:

Capture32312312123123.JPG

Quiero esto:

IdFechaSemana
325872/5/20201
325872/6/20201
325872/7/20201
325872/8/20201
325872/9/20201
325872/10/20201
325872/11/20201
325872/12/20202
325872/13/20202
325872/14/20202
325872/15/20202
325872/16/20202
325872/17/20202
325872/18/20202
325872/19/20203
325872/20/20203
325872/21/20203
325872/22/20203
325872/23/20203
325872/24/20203
325872/25/20203
930245/12/20201
930245/13/20201
930245/14/20201
930245/15/20201
930245/16/20201
930245/17/20201
930245/18/20201
953792/22/20191
953792/23/20191
953792/24/20191
953792/25/20191
953792/26/20191
953792/27/20191
953792/28/20191
953793/1/20192
953793/2/20192
953793/3/20192
953793/4/20192
953793/5/20192
953793/6/20192
953793/7/20192

Básicamente, cada identificador de la tabla original es un índice para la nueva tabla. Cada marca de tiempo de la tabla original se utiliza para crear la entrada de fecha inicial y, a continuación, tiene que incrementar automáticamente las fechas en función del número de longitudes de la tabla original por 7, ya que la longitud es una semana.

Correcto, @jeronimo2334 pegue el código fuente como texto como pegó el resultado que desea. De lo contrario, tengo que escribir todos sus datos para probar y no voy a hacer eso.


@ 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 No sabía que estabas haciendo eso, ¡lo aprecié!

Tabla original:

IdweekLengthTimestamp
84893141575892800
8684821582459200
89665151575288000
8966891584964800
90115161575288000
90262171579435200
90449271573905600
90532111583755200
90556161575288000
90581161575288000
90635121578312000
90701161575288000
90723181575201600
90771201578312000
91571151575288000
91672151575288000
91708181575892800
91724121577966400
91894181574683200

@Greg_Deckler Antes de entrar demasiado profundo, acabo de recordar que una nueva semana debería aumentar los domingos y no cada 8o día.

@jeronimo2334 - OK, así que ahora necesito entender cómo se está recuperando de sus datos de origen a su resultado previsto.

¿Está diciendo que dado un identificador y una marca de tiempo y el número de semanas que desea generar una fila para cada fecha de la marca de tiempo de fecha de inicio para el número de semanas especificado. Así que, si hubiera

ID 1, Semanas 1 y una marca de tiempo que se tradujo a 1/1/2020 conseguiría filas como:

ID, Fecha, Semana

1,1/1/2020,1

1,1/2/2020,1

1,1/3/2020,1

...

1,1/7/2020,1

Por ejemplo.


@ 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 ¡Precisamente! La única advertencia es que el indicador de la semana tendría que incrementarcada cada domingo para indicar que es una nueva semana, no cada 7 días.

Bien, @jeronimo2334 , ahora estamos llegando a algún lado. Datos de muestra, resultados esperados y una explicación de cómo llegar del punto A al punto B. Déjame echar un vistazo.


@ 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...

Muy bien @jeronimo2334 esto tomó un poco de TRABAJO!! Tuve que sacar una bolsa entera de trucos en este caso. Comienza con la conversión de la fecha de la época de Unix a UTC:

firstDate = 
VAR UnixDays = [timeStamp]/(60*60*24)
RETURN (DATEVALUE("1/1/1970")+UnixDays)

Entonces esta monstruosidad. PBIX está unido.

Table 2 = 
    VAR __Table =
        SUMMARIZE(
            'Table',
            'Table'[id],
            'Table'[weekLength],
            'Table'[firstDate],
            "__DateNum1",INT([firstDate])
        )
    VAR __Calendar = 
        ADDCOLUMNS(
            CALENDAR(
                DATE(2019,1,1),
                DATE(2021,12,31)
            ),
            "__Weeknum",WEEKNUM([Date],17),
            "__DateNum2",INT([Date]),
            "__Year",YEAR([Date])
        )
    VAR __GeneratedTable = 
            FILTER(
                GENERATE(__Table,__Calendar),
                [__DateNum2]>=[__DateNum1]
            )
    VAR __GeneratedTable2 = 
        ADDCOLUMNS(
            __GeneratedTable,
            "__Sequential",
                VAR MaxWeeks = SUMMARIZE(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year],"MaxWeek",MAXX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Weeknum]))
                VAR MyYear = [__Year]
                VAR MyStart = SUMX(FILTER(MaxWeeks,[__Year]<MyYear),[MaxWeek])
                VAR firstYear = MINX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year])
                VAR myNum = IF(MyYear=firstYear,[__Weeknum],MyStart+[__Weeknum])
                RETURN myNum
        )
    VAR __GeneratedTable3 = 
        ADDCOLUMNS(
            __GeneratedTable2,
            "__WeeksFromMin",
                [__Sequential] - MINX(FILTER(__GeneratedTable2,[id]=EARLIER([id])),[__Sequential]) + 1
        )
RETURN
    SELECTCOLUMNS(
        FILTER(
            __GeneratedTable3,
            [__WeeksFromMin] <= [weekLength]
        ),
        "id",[id],
        "date",[Date],
        "week",[__Sequential]
    )


@ 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 ¡Esto es increíble! Una cosa, sin embargo, la semana debe ser sólo un contador, no una representación de una semana en el año calendario.

En otras palabras, la columna de la semana no debe ser mayor que la semana duración original en ningún momento. Por ejemplo, si tiene una fila como:

id - weekLength - firstDate

23 - 5 - 1584964800

La primera semana debe comenzar con el contador de la semana 1, luego en el primer domingo incrementamos el contador de la semana a 2 y así sucesivamente hasta que lleguemos a la semana 5. La razón por la que menciono mucho el domingo es porque las marcas de tiempo firstDate podrían ser cualquier día de la semana, por lo que no podemos incrementar el contador mediante programación.

Sí. 🙂 En serio, @jeronimo2334, esto fue un verdadero desafío.

Así que pensé en eso. Creo que solo tienes que hacer una edición muy pequeña:

Table 2 = 
    VAR __Table =
        SUMMARIZE(
            'Table',
            'Table'[id],
            'Table'[weekLength],
            'Table'[firstDate],
            "__DateNum1",INT([firstDate])
        )
    VAR __Calendar = 
        ADDCOLUMNS(
            CALENDAR(
                DATE(2019,1,1),
                DATE(2021,12,31)
            ),
            "__Weeknum",WEEKNUM([Date],17),
            "__DateNum2",INT([Date]),
            "__Year",YEAR([Date])
        )
    VAR __GeneratedTable = 
            FILTER(
                GENERATE(__Table,__Calendar),
                [__DateNum2]>=[__DateNum1]
            )
    VAR __GeneratedTable2 = 
        ADDCOLUMNS(
            __GeneratedTable,
            "__Sequential",
                VAR MaxWeeks = SUMMARIZE(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year],"MaxWeek",MAXX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Weeknum]))
                VAR MyYear = [__Year]
                VAR MyStart = SUMX(FILTER(MaxWeeks,[__Year]<MyYear),[MaxWeek])
                VAR firstYear = MINX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year])
                VAR myNum = IF(MyYear=firstYear,[__Weeknum],MyStart+[__Weeknum])
                RETURN myNum
        )
    VAR __GeneratedTable3 = 
        ADDCOLUMNS(
            __GeneratedTable2,
            "__WeeksFromMin",
                [__Sequential] - MINX(FILTER(__GeneratedTable2,[id]=EARLIER([id])),[__Sequential]) + 1
        )
RETURN
    SELECTCOLUMNS(
        FILTER(
            __GeneratedTable3,
            [__WeeksFromMin] <= [weekLength]
        ),
        "id",[id],
        "date",[Date],
        "week",[__WeeksFromMin]
    )


@ 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, eres fenomenal! No tenía ninguna expectativa cuando empecé a trabajar en esto, ¡pero ahora puedo entregar mi proyecto! Muchas gracias, señor.

Una última cosa si no es demasiado, ¿le importaría agregar algunos comentarios en su fragmento de código sólo para que pueda tratar de entender cómo todo esto se está uniendo.

OK, @jeronimo2334 así que te guiaré a través del código y sólo FYI el código está escrito de tal manera que lo estaba descubriendo en el camino, no está de ninguna manera optimizado ni algo por el estilo.

Así que comencé con la premisa de que iba a tener que usar GENERATE para tomar su tabla de hechos y crear un producto cartesiano contra una tabla de fechas. Cada vez que vea que DAX necesita crear filas de la nada, es una buena apuesta que GENERATE va a estar involucrado. O GENERATESERIES.

Por lo tanto, lo primero que hay que hacer es obtener una represenetation de su mesa. Eso es __Table. Probablemente no necesitaba usar SUMMARIZE aquí, probablemente podría haber utilizado ADDCOLUMNS. Sus horarios eran en 12:00:00 PM, que no coincide con 12:00:00 AM que es la fecha / horas creadas por la función CALENDAR por lo que __DateNum1 utiliza INT para devolver la parte del día del valor de fecha / hora, eliminando el componente de hora.

A continuación, necesitamos nuestra tabla Calendario. He utilizado el principio de mínimos/máximos razonables, es posible que tenga que cambiar el rango aquí. Añadido en __Weeknum columna usando WEEKNUM con 17 que es un truco DAX indocumentado que comienza una nueva semana el domingo. __DateNum2 es la misma historia que __DateNum1. También es necesario agregar __Year porque vamos a necesitar __Sequential más adelante.

Así, en __GeneratedTable, podemos usar GENERATE para crear el producto cartesiano de nuestras dos tablas. A continuación, podemos FILTRAR esto para cualquier fila en la que __DateNum2 > __DateNum1. Si __DateNum2 < __DateNum1 no queremos esas filas porque __DateNum1 es nuestra "firstDate".

Ahora viene un poco de diversión. Necesitamos agregar un identificador de semana secuencial por ID a nuestro __GeneratedTable y llamar a la nueva tabla __GeneratedTable2. Sequential agrega un número de semana secuencial. Ahora, puede haber un problema aquí, ya que esta versión no tiene en cuenta las semanas incompletas al final del año. He creado una versión que explica esto que puede que tenga que desenterrar.

Así que ahora podemos crear __GeneratedTable3. En este __WeeksFromMin encontramos el valor secuencial mínimo para cada id y lo restamos de nuestro valor de semana secuencial y agregamos 1. Ahora tenemos nuestro contador de la semana. Por lo tanto, en nuestro Return, simplemente FILTRAmos nuestro __GeneratedTable3 para filas donde el __WeeksFromMin es menor o igual que el weekLength deseado. Y usamos SELECTCOLUMNS para deshacernos de todas las columnas innecesarias que hemos creado.


@ 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 muchas gracias de nuevo!

Acabo de notar un problema con semanas que incrementan incorrectamente cuando el año cambia. Se ha añadido una imagen que muestra cómo la semana se incrementó el miércoles en lugar del domingo.

Capture33221212112.JPG

Sí, a eso me refería con respecto a las semanas de fin de año. Es porque WEEKNUM es por año por lo que una semana que abarca años va a tener parte de ella ser 52/53 y la otra parte 1. Tengo una solución para ello, déjame desenterrarlo.


@ 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...

Bien, @jeronimo2334 creo que lo tengo, tuve que ajustarlo un poco para que circunstancias particulares. Probablemente necesite crear una medida rápida secuencial 2 que establezca este patrón. Los únicos cambios fueron en la __Sequential la creación de columnas. Básicamente, en la variable de tabla MaxWeek, agrego una columna llamada __Count, que cuenta cuántos días hay en la última semana del año. A continuación, agrego una variable de ajuste que cuenta cuántos años anteriores el __Count es menor que 7. A continuación, simplemente podemos ajustar (restar) que muchos números de semana de nuestro cálculo para __Sequential. Parece que sirve de nada.

Table 2 = 
    VAR __Table =
        SUMMARIZE(
            'Table',
            'Table'[id],
            'Table'[weekLength],
            'Table'[firstDate],
            "__DateNum1",INT([firstDate])
        )
    VAR __Calendar = 
        ADDCOLUMNS(
            CALENDAR(
                DATE(2019,1,1),
                DATE(2021,12,31)
            ),
            "__Weeknum",WEEKNUM([Date],17),
            "__DateNum2",INT([Date]),
            "__Year",YEAR([Date])
        )
    VAR __GeneratedTable = 
            FILTER(
                GENERATE(__Table,__Calendar),
                [__DateNum2]>=[__DateNum1]
            )
    VAR __GeneratedTable2 = 
        ADDCOLUMNS(
            __GeneratedTable,
            "__Sequential",
                VAR MaxWeeks = ADDCOLUMNS(SUMMARIZE(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year],"MaxWeek",MAXX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Weeknum])),"__Count",COUNTROWS(FILTER(__GeneratedTable,[id]=EARLIER([id])&&[__Year]=EARLIER([__Year]) && [__Weeknum]=[MaxWeek])))
                VAR MyYear = [__Year]
                VAR MyStart = SUMX(FILTER(MaxWeeks,[__Year]<MyYear),[MaxWeek])
                VAR firstYear = MINX(FILTER(__GeneratedTable,[id]=EARLIER([id])),[__Year])
                VAR adjusment = COUNTROWS(FILTER(MaxWeeks,[__Year]<MyYear && [__Count] < 7))
                VAR myNum = IF(MyYear=firstYear,[__Weeknum],MyStart+[__Weeknum]-adjusment)
                RETURN myNum
        )
    VAR __GeneratedTable3 = 
        ADDCOLUMNS(
            __GeneratedTable2,
            "__WeeksFromMin",
                [__Sequential] - MINX(FILTER(__GeneratedTable2,[id]=EARLIER([id])),[__Sequential]) + 1
        )
RETURN
    SELECTCOLUMNS(
        FILTER(
            __GeneratedTable3,
            [__WeeksFromMin] <= [weekLength]
        ),
        "id",[id],
        "date",[Date],
        "week",[__WeeksFromMin]
    )


@ 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, Impresionante, que hizo el truco!

amitchandak
Super User
Super User

@jeronimo2334 , debe ser en segundo o milisegundo. Puede crear nuevas columnas como

Fecha: dateadd(date(1900,1,1),[firstdate]/(24*60*60),DAY)

WeekNum á weeknum ([Fecha])

Día de la semana: día de la semana([fecha])

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.