Directorio de artículos de la serie
[Habilidades prácticas de desarrollo de SQL] serie (1): lo que hay que decir sobre SQL
[Habilidades prácticas de desarrollo de SQL] serie (2): consulta simple de tabla única
[Habilidades prácticas de desarrollo de SQL] serie (3): esas cosas sobre SQL sorting
[Habilidades prácticas de desarrollo de SQL] Serie (4): Discutir las precauciones para usar UNION ALL y Cadena vacía & UNION y OR del Plan de ejecución Serie [
Habilidades prácticas de desarrollo de SQL] (5): Observar la eficiencia de IN, EXISTS y INNER JOIN del Plan de ejecución, necesitamos dividir los escenarios y no memorizar la conclusión en línea
[Habilidades prácticas de desarrollo de SQL] serie (6): observe la eficiencia de NOT IN, NOT EXISTS y LEFT JOIN del plan de ejecución, y recuerde que las condiciones de asociación internas y externas no deben perderse
[Serie de habilidades prácticas de desarrollo de SQL] (siete): Hablemos sobre cómo comparar los datos de diferencia y el número correspondiente de registros en dos tablas bajo la premisa de datos duplicados [Desarrollo de
SQL habilidades prácticas] serie (ocho): hable sobre cómo insertar datos, que es más flexible que las restricciones para restringir la inserción de datos Y cómo una declaración de inserción inserta varias tablas al mismo tiempo [Habilidades prácticas de desarrollo de SQL] serie (9):
Un actualizar actualiza por error otros datos de columna para que estén vacíos? Fusionar actualización de reescritura! ¡Dé cinco formas de eliminar datos duplicados!
Serie [Habilidades prácticas de desarrollo SQL] (10): a partir de dividir cadenas, reemplazar cadenas y contar el número de ocurrencias de cadenas
Serie [Habilidades prácticas de desarrollo SQL] (11): Tome algunos casos para hablar de translate|regexp_replace| listagg |wmsys.wm_concat|substr|regexp_substr Funciones de uso común
[Habilidades prácticas de desarrollo de SQL] serie (12): Tres preguntas (¿cómo ordenar las cadenas en orden alfabético después de desduplicar las letras de la cadena? ¿Cómo identificar qué cadenas contienen números? ¿Cómo convertir datos delimitados en una lista IN de varios valores?)
[Habilidades prácticas de desarrollo de SQL] Serie (13): discuta las funciones agregadas comunes y vea sum() sobre () a través del plan de ejecución para acumular los salarios de los empleados [Habilidades prácticas de desarrollo de SQL] Serie (14): calcule
el saldo después del consumo y calcule el acumulado suma de la facturación bancaria y calcule el salario de los tres empleados principales en cada departamento
[habilidades prácticas de desarrollo de SQL] serie (quince): encuentre la información de datos de la fila donde se encuentra el mayor valor y calcule rápidamente la suma de max/min() mantener () over(), fisrt_value, last_value, ratio_to_report
[Habilidades prácticas de desarrollo de SQL] serie (16): operación de tipo de tiempo en el almacén de datos (primario) día, mes, año, hora, minuto, segunda diferencia y cálculo de intervalo de tiempo [desarrollo de
SQL Habilidades Prácticas] Serie (Diecisiete): Las operaciones de tipo tiempo en almacenes de datos (primario) determinan el número de días hábiles entre dos fechas, calculan el número de ocurrencias de cada fecha en la semana del año y determinan la diferencia entre el registro actual y el siguiente registro Número de días
[Habilidades prácticas de desarrollo de SQL] serie (18): operaciones de tipo de tiempo en el almacén de datos (avanzado) INTERVALO, EXTRACTO y cómo determinar si un año es un año bisiesto y el cálculo de la semana [desarrollo de SQL habilidades prácticas] serie (19)
: ¿Cómo imprimir el calendario del mes o año actual con un SQL en la operación de tipo de tiempo (avanzado) en el almacén de datos? ¿Cómo determinar la fecha del primer y último día de la semana en un mes?
[Habilidades prácticas de desarrollo de SQL] Serie (20): operaciones de tipo de tiempo en el almacén de datos (avanzado) Obtener la hora de inicio y finalización de un trimestre y cómo contar datos de tiempo discontinuo [Habilidades prácticas de desarrollo de SQL] Serie (21): operaciones de tipo de tiempo de datos en
el almacén (avanzado) Identifique rangos de fechas superpuestas y resuma datos en intervalos específicos de 10 minutos
[Habilidades prácticas de desarrollo de SQL] serie (22): Escenario de informe de almacén de datos ☞ ¿La eficiencia de la función de análisis debe ser rápida? Charla 1 Hablar sobre la implementación de paginación de conjuntos de resultados y muestreo entrelazado
[Habilidades prácticas de desarrollo de SQL] Serie (23): Escenario de informe de almacén de datos ☞ ¿Cómo desduplicar permutaciones de datos y cómo encontrar el registro que contiene los valores máximo y mínimo? Use el plan de ejecución nuevamente para demostrarle que el rendimiento del la función de análisis no es buena Debe ser alta
[Habilidades prácticas de desarrollo de SQL] serie (24): escenario de informe de almacén de datos ☞ Explicación detallada de "fila a columna" y "columna a fila" a través del plan de ejecución del caso [Habilidades prácticas de desarrollo de SQL]
serie (25 ): Escenario de informe de almacén de datos ☞ Los datos duplicados en el conjunto de resultados solo se muestran una vez y la forma eficiente de escribir la diferencia salarial del departamento de cálculo y cómo agrupar datos rápidamente [Habilidades prácticas de desarrollo de SQL]
serie (26): Datos escenario de informe de almacén ☞ chat Cómo ROLLUP y UNION ALL agrupan los totales respectivamente y cómo identificar qué filas son las filas de resultados del resumen
Directorio de artículos
prefacio
El contenido principal de este artículo trata sobre las operaciones avanzadas de operaciones de tipo tiempo. Estas operaciones también son casos de operaciones de tiempo más difíciles en el almacén de datos: cómo imprimir el calendario del mes actual o el calendario del año actual con un SQL ? ? ? ¿Cómo contar todas las fechas que pertenecen a un determinado día de la semana en un año?¿Cómo determinar la primera y la última - la fecha de un determinado día de la semana en un determinado mes? ? ?
[Habilidades prácticas de desarrollo de SQL] Esta serie de bloggers escribe como una revisión del conocimiento antiguo. Después de todo, el desarrollo de SQL es muy importante y básico en los escenarios de análisis de datos. Las entrevistas a menudo preguntarán sobre el desarrollo de SQL y la experiencia de ajuste. Creo que cuando termine escribir esto Una serie de artículos también puede ganar algo, y también puede enfrentar entrevistas de SQL con facilidad en el futuro ~.
1. Determinar todas las fechas que pertenecen a un determinado día de la semana dentro de un año
Este ejemplo solicita devolver todos los viernes del año especificado, usar el conocimiento presentado anteriormente para enumerar la información de todo el año y luego filtrarla.
SQL> with t as
2 (select trunc(sysdate, 'y') + (level - 1) as dy
3 from dual
4 connect by level <=
5 (add_months(trunc(sysdate, 'y'), 12) - trunc(sysdate, 'y')))
6 select dy, to_char(dy, 'day') as 周五 from t where to_char(dy, 'd') = 6;
DY 周五
----------- ---------------------------------------------------------------------------
2023-1-6 星期五
2023-1-13 星期五
2023-1-20 星期五
2023-1-27 星期五
2023-2-3 星期五
2023-2-10 星期五
2023-2-17 星期五
2023-2-24 星期五
2023-3-3 星期五
2023-3-10 星期五
2023-3-17 星期五
2023-3-24 星期五
2023-3-31 星期五
2023-4-7 星期五
2023-4-14 星期五
2023-4-21 星期五
2023-4-28 星期五
2023-5-5 星期五
2023-5-12 星期五
2023-5-19 星期五
2023-5-26 星期五
2023-6-2 星期五
2023-6-9 星期五
2023-6-16 星期五
2023-6-23 星期五
2023-6-30 星期五
2023-7-7 星期五
2023-7-14 星期五
2023-7-21 星期五
2023-7-28 星期五
2023-8-4 星期五
2023-8-11 星期五
2023-8-18 星期五
2023-8-25 星期五
2023-9-1 星期五
2023-9-8 星期五
2023-9-15 星期五
2023-9-22 星期五
2023-9-29 星期五
2023-10-6 星期五
2023-10-13 星期五
2023-10-20 星期五
2023-10-27 星期五
2023-11-3 星期五
2023-11-10 星期五
2023-11-17 星期五
2023-11-24 星期五
2023-12-1 星期五
2023-12-8 星期五
2023-12-15 星期五
2023-12-22 星期五
2023-12-29 星期五
52 rows selected
El objetivo de este ejemplo es usarlo to_char(dy, 'd')
para juzgar, a fin de evitar la influencia de diferentes configuraciones del cliente, como:
SQL> select to_char(sysdate,'day')as day,to_char(sysdate,'d') as d from dual;
DAY D
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
星期三 4
SQL> alter session set nls_language=american;
Session altered
SQL> select to_char(sysdate,'day')as day,to_char(sysdate,'d') as d from dual;
DAY D
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
wednesday 4
SQL>
Se puede ver que cuando se usa el parámetro "día", los resultados devueltos por diferentes conjuntos de caracteres son diferentes, pero "d" no se ve afectado.
2. Determinar la fecha del primer y último día de la semana en un mes
En este ejemplo, se requiere devolver el primer lunes y el último lunes del mes actual, podemos encontrar el lunes de la próxima semana que es siete días antes del final del mes anterior y el final del mes actual respectivamente.
SQL> select next_day(trunc(sysdate,'mm')-1,2) as 第一周周一,
2 next_day(last_day(trunc(sysdate,'mm'))-7,2) as 最后一周的周一
3 from dual;
第一周周一 最后一周的周一
----------- -----------
2023-2-6 2023-2-27
3. Crea un calendario para este mes
Ahora hay una demanda: debe escribir un sql para imprimir la información del calendario del mes actual. ¿
Está un poco confundido cuando ve esta demanda?
¿Cómo lograrlo? ? ?
De hecho, podemos enumerar todas las fechas en el mes especificado y convertirlas a la información de la semana correspondiente, y luego hacer una "conversión de fila-columna" según la semana. Le mostraré una forma de intercambiar filas y columnas aquí, porque no se presenta pivot/unpivot
, así que simplemente case when
hazlo.
SQL> with t as
2 (select trunc(sysdate, 'mm') + (level - 1) as dy
3 from dual
4 connect by level <=
5 (add_months(trunc(sysdate, 'mm'), 1) - trunc(sysdate, 'mm'))),
6 t1 as
7 (select to_char(dy, 'iw') as 所在周,
8 to_char(dy, 'dd') as 日期,
9 to_number(to_char(dy, 'd')) 周几
10 from t)
11 select max(case 周几
12 when 2 then
13 日期
14 end) 周一,
15 max(case 周几
16 when 3 then
17 日期
18 end) 周二,
19 max(case 周几
20 when 4 then
21 日期
22 end) 周三,
23 max(case 周几
24 when 5 then
25 日期
26 end) 周四,
27 max(case 周几
28 when 6 then
29 日期
30 end) 周五,
31 max(case 周几
32 when 7 then
33 日期
34 end) 周六,
35 max(case 周几
36 when 1 then
37 日期
38 end) 周天
39 from t1
40 group by 所在周
41 order by 所在周;
周一 周二 周三 周四 周五 周六 周天
--------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
SQL>
4. Calendario Anual
Cómo escribir el calendario de un mes se presentó anteriormente.
¿Y si es todo el año? ¡El camino es muy diferente! ! ! Solo enumera 365 días.
Hay un pequeño problema aquí, el valor de devolución de datos de la semana 53 to_char(日期,'iw')
es incorrecto y se devuelve la primera semana.
SQL> WITH x AS
2 (SELECT to_date('2013-12-27', 'yyyy-mm-dd') + (LEVEL - 1) AS d
3 FROM dual
4 CONNECT BY LEVEL <= 5)
5 SELECT d, to_char(d, 'day') AS DAY, to_char(d, 'iw') AS iw FROM x;
D DAY IW
----------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
2013-12-27 星期五 52
2013-12-28 星期六 52
2013-12-29 星期日 52
2013-12-30 星期一 01
2013-12-31 星期二 01
SQL>
Estos datos necesitan case when
ser procesados.
SQL>
SQL> WITH x AS
2 (SELECT to_date('2013-12-27', 'yyyy-mm-dd') + (LEVEL - 1) AS d
3 FROM dual
4 CONNECT BY LEVEL <= 5),
5 x1 as
6 (SELECT d,
7 to_char(d, 'day') AS DAY,
8 to_char(d, 'mm') AS mm,
9 to_char(d, 'iw') AS iw
10 FROM x)
11 select d,
12 day,
13 mm,
14 iw,
15 case
16 when mm = 12 and iw = '01' then
17 '53'
18 else
19 iw
20 end as new_iw
21 from x1;
D DAY MM IW NEW_IW
----------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
2013-12-27 星期五 12 52 52
2013-12-28 星期六 12 52 52
2013-12-29 星期日 12 52 52
2013-12-30 星期一 12 01 53
2013-12-31 星期二 12 01 53
SQL>
Entonces el calendario anual se puede consultar como:
SQL> with t as
2 (select trunc(sysdate, 'y') as 本年年初,
3 add_months(trunc(sysdate, 'y'), 12) as 下年初
4 from dual),
5 t1 as
6 (select 本年年初 + (level - 1) as 日期
7 from t
8 connect by level <= 下年初 - 本年年初),
9 t2 as
10 (select 日期,
11 to_char(日期, 'mm') as 月份,
12 to_char(日期, 'iw') 所在周,
13 to_number(to_char(日期, 'd')) as 周几
14 from t1),
15 t3 as
16 (select 日期,
17 月份,
18 case
19 when 月份 = 12 and 所在周 = '01' then
20 '53'
21 else
22 所在周
23 end as 所在周,
24 周几
25 from t2)
26 select case
27 when lag(月份) over(order by 所在周) = 月份 then
28 null
29 else
30 月份
31 end as 月份,
32 所在周,
33 max(case 周几
34 when 2 then
35 日期
36 end) 周一,
37 max(case 周几
38 when 3 then
39 日期
40 end) 周二,
41 max(case 周几
42 when 4 then
43 日期
44 end) 周三,
45 max(case 周几
46 when 5 then
47 日期
48 end) 周四,
49 max(case 周几
50 when 6 then
51 日期
52 end) 周五,
53 max(case 周几
54 when 7 then
55 日期
56 end) 周六,
57 max(case 周几
58 when 1 then
59 日期
60 end) 周天
61 from t3
62 group by 月份, 所在周
63 order by 2;
月份 所在周 周一 周二 周三 周四 周五 周六 周天
--------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
01 01 2023-1-2 2023-1-3 2023-1-4 2023-1-5 2023-1-6 2023-1-7 2023-1-8
02 2023-1-9 2023-1-10 2023-1-11 2023-1-12 2023-1-13 2023-1-14 2023-1-15
03 2023-1-16 2023-1-17 2023-1-18 2023-1-19 2023-1-20 2023-1-21 2023-1-22
04 2023-1-23 2023-1-24 2023-1-25 2023-1-26 2023-1-27 2023-1-28 2023-1-29
05 2023-1-30 2023-1-31
02 05 2023-2-1 2023-2-2 2023-2-3 2023-2-4 2023-2-5
06 2023-2-6 2023-2-7 2023-2-8 2023-2-9 2023-2-10 2023-2-11 2023-2-12
07 2023-2-13 2023-2-14 2023-2-15 2023-2-16 2023-2-17 2023-2-18 2023-2-19
08 2023-2-20 2023-2-21 2023-2-22 2023-2-23 2023-2-24 2023-2-25 2023-2-26
09 2023-2-27 2023-2-28
03 09 2023-3-1 2023-3-2 2023-3-3 2023-3-4 2023-3-5
10 2023-3-6 2023-3-7 2023-3-8 2023-3-9 2023-3-10 2023-3-11 2023-3-12
11 2023-3-13 2023-3-14 2023-3-15 2023-3-16 2023-3-17 2023-3-18 2023-3-19
12 2023-3-20 2023-3-21 2023-3-22 2023-3-23 2023-3-24 2023-3-25 2023-3-26
13 2023-3-27 2023-3-28 2023-3-29 2023-3-30 2023-3-31
04 13 2023-4-1 2023-4-2
14 2023-4-3 2023-4-4 2023-4-5 2023-4-6 2023-4-7 2023-4-8 2023-4-9
15 2023-4-10 2023-4-11 2023-4-12 2023-4-13 2023-4-14 2023-4-15 2023-4-16
16 2023-4-17 2023-4-18 2023-4-19 2023-4-20 2023-4-21 2023-4-22 2023-4-23
17 2023-4-24 2023-4-25 2023-4-26 2023-4-27 2023-4-28 2023-4-29 2023-4-30
05 18 2023-5-1 2023-5-2 2023-5-3 2023-5-4 2023-5-5 2023-5-6 2023-5-7
19 2023-5-8 2023-5-9 2023-5-10 2023-5-11 2023-5-12 2023-5-13 2023-5-14
20 2023-5-15 2023-5-16 2023-5-17 2023-5-18 2023-5-19 2023-5-20 2023-5-21
21 2023-5-22 2023-5-23 2023-5-24 2023-5-25 2023-5-26 2023-5-27 2023-5-28
22 2023-5-29 2023-5-30 2023-5-31
06 22 2023-6-1 2023-6-2 2023-6-3 2023-6-4
23 2023-6-5 2023-6-6 2023-6-7 2023-6-8 2023-6-9 2023-6-10 2023-6-11
24 2023-6-12 2023-6-13 2023-6-14 2023-6-15 2023-6-16 2023-6-17 2023-6-18
25 2023-6-19 2023-6-20 2023-6-21 2023-6-22 2023-6-23 2023-6-24 2023-6-25
26 2023-6-26 2023-6-27 2023-6-28 2023-6-29 2023-6-30
07 26 2023-7-1 2023-7-2
27 2023-7-3 2023-7-4 2023-7-5 2023-7-6 2023-7-7 2023-7-8 2023-7-9
28 2023-7-10 2023-7-11 2023-7-12 2023-7-13 2023-7-14 2023-7-15 2023-7-16
29 2023-7-17 2023-7-18 2023-7-19 2023-7-20 2023-7-21 2023-7-22 2023-7-23
30 2023-7-24 2023-7-25 2023-7-26 2023-7-27 2023-7-28 2023-7-29 2023-7-30
31 2023-7-31
08 31 2023-8-1 2023-8-2 2023-8-3 2023-8-4 2023-8-5 2023-8-6
32 2023-8-7 2023-8-8 2023-8-9 2023-8-10 2023-8-11 2023-8-12 2023-8-13
33 2023-8-14 2023-8-15 2023-8-16 2023-8-17 2023-8-18 2023-8-19 2023-8-20
34 2023-8-21 2023-8-22 2023-8-23 2023-8-24 2023-8-25 2023-8-26 2023-8-27
35 2023-8-28 2023-8-29 2023-8-30 2023-8-31
09 35 2023-9-1 2023-9-2 2023-9-3
36 2023-9-4 2023-9-5 2023-9-6 2023-9-7 2023-9-8 2023-9-9 2023-9-10
37 2023-9-11 2023-9-12 2023-9-13 2023-9-14 2023-9-15 2023-9-16 2023-9-17
38 2023-9-18 2023-9-19 2023-9-20 2023-9-21 2023-9-22 2023-9-23 2023-9-24
39 2023-9-25 2023-9-26 2023-9-27 2023-9-28 2023-9-29 2023-9-30
10 39 2023-10-1
40 2023-10-2 2023-10-3 2023-10-4 2023-10-5 2023-10-6 2023-10-7 2023-10-8
41 2023-10-9 2023-10-10 2023-10-11 2023-10-12 2023-10-13 2023-10-14 2023-10-15
42 2023-10-16 2023-10-17 2023-10-18 2023-10-19 2023-10-20 2023-10-21 2023-10-22
43 2023-10-23 2023-10-24 2023-10-25 2023-10-26 2023-10-27 2023-10-28 2023-10-29
44 2023-10-30 2023-10-31
11 44 2023-11-1 2023-11-2 2023-11-3 2023-11-4 2023-11-5
45 2023-11-6 2023-11-7 2023-11-8 2023-11-9 2023-11-10 2023-11-11 2023-11-12
46 2023-11-13 2023-11-14 2023-11-15 2023-11-16 2023-11-17 2023-11-18 2023-11-19
47 2023-11-20 2023-11-21 2023-11-22 2023-11-23 2023-11-24 2023-11-25 2023-11-26
48 2023-11-27 2023-11-28 2023-11-29 2023-11-30
12 48 2023-12-1 2023-12-2 2023-12-3
49 2023-12-4 2023-12-5 2023-12-6 2023-12-7 2023-12-8 2023-12-9 2023-12-10
50 2023-12-11 2023-12-12 2023-12-13 2023-12-14 2023-12-15 2023-12-16 2023-12-17
51 2023-12-18 2023-12-19 2023-12-20 2023-12-21 2023-12-22 2023-12-23 2023-12-24
01 52 2023-1-1
12 52 2023-12-25 2023-12-26 2023-12-27 2023-12-28 2023-12-29 2023-12-30 2023-12-31
63 rows selected
SQL>
A través de este ejemplo, podemos ver que el uso de la declaración with puede hacer que su pensamiento y código se muestren muy claros, y puede verificar fácilmente si los pasos t, t1, t2 y t3 han logrado el propósito esperado. Esta es una de las funciones de la declaración con uno.
Resumir
Los cuatro casos de operaciones de tiempo presentados en este capítulo aún son difíciles. Si puede alcanzar este nivel, puede sentir que las operaciones de tipo de tiempo deberían poder hacer un trabajo con facilidad ~