Dan80
Hola a todos, tengo una tabla con 2 columnas, fecha de inicio y fecha de finalización de las campañas de ventas, pero necesito convertir el rango en una lista de fechas, es decir, una columna de todas las fechas que hemos estado en venta. Alguna idea de como se puede hacer esto???
Marcel Beug
En respuesta a sean
En M se puede hacer de varias formas pero la más fácil sería:
– convertir las fechas de inicio y finalización en números,
– crear listas a partir de esos números,
– ampliar las listas y
– convertir los números a fechas
como se demuestra en este breve video.
Kasunpathirana
Wow @MarcelBeug El salvador, este es un gran truco. Gracias por esto
Phil_Seamark
Si deseaba una solución DAX,
Asegúrese de tener una tabla de Fechas con una columna llamada Fecha
Luego puede crear la siguiente tabla si su tabla base se ve así:
Campaña Fecha de inicio Fecha de finalización
A | 01/01/2017 | 17/01/2017 |
B | 01/05/2017 | 01/12/2017 |
Campaigns Expanded = SELECTCOLUMNS( FILTER( CROSSJOIN('Campaigns',dates), 'Campaigns'[StartDate]<='Dates'[Date] && 'Campaigns'[EndDate] >= 'Dates'[Date] ), "Campaign" , [Campaign] , "Active Date" , 'Dates'[Date])
Dan80
En respuesta a Phil_Seamark
Muchas gracias por tu ayuda, te lo agradezco
sean
En respuesta a Dan80
Hola, @Phil_Seamark, probé tu solución con esta muestra de datos.
CampañasInicioFin
A | 1/1/2017 | 4/1/2017 |
B | 10/01/2017 | 13/01/2017 |
C | 2/3/2017 | 2/5/2017 |
D | 22/02/2017 | 3/1/2017 |
mi | 1/1/2017 | 3/1/2017 |
Con la solución de @MarcelBeug tengo 79 filas
¡Mi forma de hacer esto con DAX también me da 79 filas!
(necesita una tabla de calendario que no esté conectada a la tabla de campañas)
Campaigns Table = SUMMARIZE ( GENERATE ( Campaigns, CALCULATETABLE ( VALUES ( 'Calendar Table'[Date] ), DATESBETWEEN ( 'Calendar Table'[Date], 'Campaigns'[Start], 'Campaigns'[End] ) ) ), 'Calendar Table'[Date], 'Campaigns'[Campaigns] )
Su fórmula genera (3705 filas) ?
Campaigns Phil = SELECTCOLUMNS ( FILTER ( CROSSJOIN ( 'Campaigns', 'Calendar Table' ), 'Campaigns'[Start] <= 'Calendar Table'[Date] && Campaigns[End] >= 'Calendar Table'[Date] ), "Campaign", [Campaigns], "Active Date", 'Calendar Table'[Date] )
Phil_Seamark
En respuesta a sean
Mmm, eso es raro. Acabo de probar y también tiene 79 filas. Puedo subir un archivo PBIX si está interesado.
También probé ambos enfoques en DaxStudio para verificar los tiempos y ver cuál era más rápido.
La consulta de @MarcelBeug tomó solo 8 ms para producir las 79 filas, mientras que mi enfoque tomó 39 ms para producir las 79 filas, por lo que creo que la función GENERATE es el camino a seguir 🙂
sean
En respuesta a Phil_Seamark
@Phil_Seamark¡Lo tengo! Vaya al Editor de consultas y aplique la solución de @MarcelBeug a la tabla Campañas original.
¡Luego mire la tabla creada con su fórmula desde 79 filas hasta 3,705 filas!
Sin embargo, TENGA EN CUENTA que la tabla GENERATE no se ve afectada por esto.
Estaba probando la solución de @MarcelBeug primero, luego agregué mi tabla GENERATE y luego la tuya en el mismo archivo en este orden.
¡Misterio resuelto!
Phil_Seamark
En respuesta a sean
Genial, estoy echando un vistazo más de cerca a los tiempos de los dos enfoques. La función GENERAR es más eficiente porque reduce el número de registros que lee de la tabla de fechas a solo los requeridos desde el principio, mientras que la función CROSS JOIN lee más de los necesarios y luego los descarta en la etapa de FILTRO.
Sin embargo, logré reducir el FILTRO CRUZADO a 5 ms haciendo esto …
my Table =
var maxdate = max(Campaigns[End]) var mindate = min(Campaigns[Start]) var datesfiltered = CALCULATETABLE('Calendar Table', 'Calendar Table'[Date] <= maxdate && 'Calendar Table'[Date] >= mindate ) return SELECTCOLUMNS ( FILTER ( CROSSJOIN ( 'Campaigns', datesfiltered ), 'Campaigns'[Start] <= 'Calendar Table'[Date] && Campaigns[End] >= 'Calendar Table'[Date] ), "Campaign", [Campaigns], "Active Date", 'Calendar Table'[Date] )
sean
A juzgar por la respuesta que acabas de proporcionar en otra publicación, asumí que no quieres que esto se haga con DAX.
Creo que he visto a @MarcelBeug hacer esto con M
Marcel Beug
En respuesta a sean
En M se puede hacer de varias formas pero la más fácil sería:
– convertir las fechas de inicio y finalización en números,
– crear listas a partir de esos números,
– ampliar las listas y
– convertir los números a fechas
como se demuestra en este breve video.
yashasvi
En respuesta a Marcel Beug
Tengo un rango de fechas que va en minutos con un incremento de 15 minutos. Cuando uso este método para convertir en números enteros. Quita los minutos y restablece cada fecha a las 12:00 AM. He intentado usar decimales en lugar de números enteros, pero sigo teniendo errores.
¿Podría proporcionar la solución si las fechas tienen minutos?
Dan80
En respuesta a yashasvi
Hola @yashasvi
Podrías dividir el proceso en dos. Convierta sus fechas en una lista primero usando {[Date From]..[Date To]}.
Luego, una vez que tenga esa lista, haga otra lista {[0]..[96]} esto representa los minutos, es decir, hay 96 * 15 minutos = 24 horas. Luego multiplique los minutos 0.0104166666666667, este es el resultado de =15/(24*60) que le dará el valor de día y minuto (en intervalos de 15 minutos).
Agregue la columna de fecha y minutos y cubra la fecha y la hora
Espero que ayude
yashasvi
En respuesta a Dan80
Gracias por la rápida respuesta @ Dan80. Cuando traté de usar su consulta M para manejar Fechas que tiene minutos. Está mostrando error. Tal vez porque cuando las fechas están en minutos, entonces necesita convertir las fechas en números decimales fijos y no en números enteros. Cuando apliqué su consulta M (que funciona perfectamente con números enteros) a los números decimales, no puede manejarlo. Traté de jugar con su consulta M y probé diferentes formatos antes [Date From]..[Date to] pero no pudo tener éxito.
¿Podría compartir la consulta M que puede manejar las fechas en minutos? Con eso me refiero a la consulta M que podría manejar el decimal (tal vez decimales fijos).
Saludos
Jmenas
En respuesta a Marcel Beug
¡@MarcelBeug muchas gracias por una solución realmente precisa y rápida!
Dan80
En respuesta a Marcel Beug
Sensacional, muchas gracias por tu ayuda!