0% encontró este documento útil (0 votos)
149 vistas11 páginas

Evaluación de SQL Server

Este documento contiene preguntas sobre SQL relacionadas con consultas, joins, agregaciones y operadores. Se piden ejemplos de sentencias SQL para resolver las preguntas planteadas.

Cargado por

cinema.llacza
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
149 vistas11 páginas

Evaluación de SQL Server

Este documento contiene preguntas sobre SQL relacionadas con consultas, joins, agregaciones y operadores. Se piden ejemplos de sentencias SQL para resolver las preguntas planteadas.

Cargado por

cinema.llacza
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

EVALUACIÓN DE SQL

NOMBRE Y APELLIDOS

DNI

FECHA NOTA

1.- Describa la diferencia entre truncar (truncate) y borrar (delete).

Borra una serie de filas de la tabla. Podemos usar una claúsula WHERE para limitar las filas a
borrar, a las que cumplan una condición. La sintaxis sería:

DELETE FROM nombre_tabla WHERE condicion

Para nuestro caso:

DELETE FROM entradas WHERE id = 2;

TRUNCATE

A diferencia de DELETE, TRUNCATE elimina todas las filas de la tabla sin borrar la tabla. :

TRUNCATE TABLE nombre_tabla;

Y para nuestro caso:

TRUNCATE TABLE entradas;

Ahora que sabemos en que consiste cada sentencia, veamos las semejanzas y diferencias:

Ambas eliminan los datos, no la estructura.

Solo DELETE permite la eliminación condicional de los registros.

DELETE es una operación registrada en el log de transacciones, basada en registrar cada


eliminación individual.

TRUNCATE es una operación registrada en el log de transacciones, pero como un todo, en


conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las
páginas de datos en las cuales existen los datos.

TRUNCATE es más rápida que DELETE.

Ambas se pueden deshacer con un ROLLBACK.

TRUNCATE reiniciará el contador para una tabla que contenga una columna IDENTITY.

DELETE mantendrá el contador de la tabla para una columna IDENTITY.

TRUNCATE es un comando DDL(lenguaje de definición de datos) mientras que DELETE es un


DML(lenguaje de manipulación de datos).

TRUNCATE no desencadena un TRIGGER, DELETE sí.


2.- ¿Qué es un Plan de Ejecución de una Consulta?

La secuencia en la que se tiene acceso a las tablas de origen.


Normalmente, hay muchas secuencias diferentes en las que el servidor de la base de datos
puede tener acceso a las tablas base para generar el conjunto de resultados. Por ejemplo, si
una instrucción SELECT hace referencia a tres tablas, el servidor de la base de datos podría
tener acceso primero a TableA, utilizar los datos de TableA para extraer las filas que
coincidan con las de TableBy, finalmente, utilizar los datos de TableB para extraer datos de
TableC. Las demás secuencias en las que el servidor de base de datos podría tener acceso a
las tablas son:
TableC, TableB, TableAo
TableB, TableA, TableCo
TableB, TableC, TableAo
TableC, TableA, TableB

Los métodos que se usan para extraer los datos de cada tabla.
Por lo general, hay métodos diferentes para tener acceso a los datos de cada tabla. Si solo
se necesitan unas cuantas filas con valores de clave específicos, el servidor de la base de
datos puede utilizar un índice. Si se necesitan todas las filas de una tabla, el servidor de la
base de datos puede omitir los índices y realizar un recorrido de la tabla. Si se necesitan
todas las filas de la tabla, pero hay un índice cuyas columnas de clave están ordenadas con
ORDER BY, realizar un recorrido del índice en lugar de un recorrido de la tabla puede evitar
otra ordenación del conjunto de resultados. Si la tabla es muy pequeña, el recorrido de la
misma puede ser el método más eficaz para la mayoría de los accesos a la tabla.

Los métodos que se usan para realizar cálculos, y cómo filtrar, agregar y ordenar
los datos de cada tabla.
A medida que se tiene acceso a los datos desde las tablas, existen distintos métodos para
realizar cálculos sobre ellos (por ejemplo, calcular valores escalares), para agregarlos y
ordenarlos tal como se define en el texto de la consulta, por ejemplo, cuando se usa una
cláusula GROUP BY o ORDER BY, y cómo filtrarlos, por ejemplo, cuando se usa una cláusula
WHERE o HAVING.

3.-Escriba un query que regrese el departamento con el salario promedio más alto
junto con ese salario promedio.

TABLA SENTENCIA
SALARI0 ( SELECT Department, AVG(Salary) FROM
Nombre_Empleado (TEXT), SALARIES GROUP BY DEPARTMENT ORDER
BY AVG(Salary) DESC LIMIT 1;
Departmento (TEXT),
Salario (INT)
)

4. Dada la siguiente sentencia SQL

SELECT P.dni, P.nombre FROM SALIDA S, SAL_PER SP, PERSONAL P, VEHICULO V WHERE
S.codsal=SP.codsal AND SP.dni=P.dni AND S.matricula=V.matricula AND
SP.funcion=P.categoria GROUP BY P.dni, P.nombre
¿Qué se debe hacer con la sentencia anterior para que obtenga los datos de los
conductores que han realizado salidas conduciendo todos los vehículos?

En el HAVING se debe añadir: COUNT(DISTINCT S.matricula)=(SELECT COUNT(*) FROM


VEHICULO) y además se puede eliminar VEHICULO del FROM y el WHERE de la consulta
principal.

5.- ¿Qué se debe añadir en la siguiente sentencia para obtener el motivo por el que
realiza más salidas el personal de cada categoría?

SELECT S.motivo, P.categoria


FROM SALIDA S, SAL_PER SP, PERSONAL P
WHERE S.codsal=SP.codsal AND SP.dni=P.dni
GROUP BY S.motivo, P.categoria
HAVING COUNT(*) >=
ALL(SELECT COUNT(*)
FROM SALIDA SS, SAL_PER SPP, PERSONA PP
WHERE SS.codsal=SPP.codsal AND SSP.dni=PP.dni

AND PP.categoria=P.categoria GROUP BY SS.motivo

6.- Aquí hay dos consultas basadas en estas dos tablas "A" y "B".

Query1: SELECT A.id FROM A WHERE A.age > ALL (SELECT B.age FROM B WHERE B.name =
'Ankit')

Query2: SELECT A.id FROM A WHERE A.age > ANY (SELECT B.age FROM B WHERE B.name =
'Ankit')

Ahora, ¿cuál de las siguientes afirmaciones es correcta para el resultado de


cada consulta?

A. El número de registros en la salida de la Consulta 1 será mayor o igual que la


salida de la Consulta 2.
B. El número de registros en la salida de la Consulta 1 será igual a la salida de la
Consulta 2.
C. El número de registros en la consulta de salida 1 será menor o igual que la salida
de la consulta 2.
D. Ninguno de las anteriores.

7. Se requiere recorrer varias tablas en SQL buscando la deuda de los unos ciertos
clientes que se encuentran en otra tabla.

Las tablas a recorrer son:

1. RCC_O1_202001
2. RCC_O1_202002
3. RCC_O1_202003
4. RCC_O1_202004
5. RCC_O1_202005
6. RCC_O1_202006
7. RCC_O1_202007
8. RCC_O1_202008
9. RCC_O1_202009
10. RCC_O1_202010
11. RCC_O1_202011
12. RCC_O1_202012

Estas tablas contiene una columna NUN_DOCUMENTO asi como también los
números de documento a buscar están en la tabla DNI con la columna
NUM_DOCUMENTO

TABLAS RCC DNI


DEUDA NUM_DOCUMENTO
NUM_DOCUMENTO
AÑOMES

Cuando manejamos bases de datos SQL debemos de olvidarnos de indicar como


hacer las cosas para indicar que es lo que se quiere hacer. SQL Server tiene
múltiples algoritmos eficientes para recorrer las tablas sin que tengamos que
generarlos nosotros. Para poder cambiar esta mentalidad, necesitamos dejar de
pensar que queremos hacer con la fila y empezar a pensar en que queremos hacer
con la columna.

Lo primero que hacemos, es tratar de unir las tablas y por ello empezamos con lo
básico que es un SELECT y un JOIN para unirlas.
SELECT *
FROM Fact_Caudal_Bocatoma fcb --Asignamos alias a las tablas para referenciarlas más fácilmente.
JOIN Fact_Caudal_Disponible fcd ON fcb.fecha = fcd.fecha --Incluimos todos los campos que usamos
para combinar las tablas.
AND fcb.periodo = fcd.periodo
AND fcb.bocatoma = fcd.rio;
Después de eso, ya tenemos todas las filas de ambas tablas con la relación correcta.
Ahora nos podemos concentrar en la fórmula. Para el condicional dentro de una
sentencia SELECT usamos CASE.
SELECT *,
-- Fórmula según se explica en la pregunta
CASE WHEN fcb.valor / fcd.valor > 1 THEN 1 ELSE fcb.valor / fcd.valor END,
-- Fórmula simplificada
CASE WHEN fcb.valor > fcd.valor THEN 1 ELSE fcb.valor / fcd.valor END
FROM Fact_Caudal_Bocatoma fcb --Asignamos alias a las tablas para referenciarlas más fácilmente.
JOIN Fact_Caudal_Disponible fcd ON fcb.fecha = fcd.fecha --Incluimos todos los campos que usamos
para combinar las tablas.
AND fcb.periodo = fcd.periodo
AND fcb.bocatoma = fcd.rio;
Por último, cambiamos el SELECT por UPDATE y usamos la fórmula para asignar el
valor a la columna correspondiente.
UPDATE fcd SET --Usamos el alias de la tabla que vamos a actualizar
factor_ajuste = CASE WHEN fcb.valor > fcd.valor THEN 1 ELSE fcb.valor / fcd.valor END
FROM Fact_Caudal_Bocatoma fcb --Asignamos alias a las tablas para referenciarlas más fácilmente.
JOIN Fact_Caudal_Disponible fcd ON fcb.fecha = fcd.fecha --Incluimos todos los campos que usamos
para combinar las tablas.
AND fcb.periodo = fcd.periodo
AND fcb.bocatoma = fcd.rio;
--Verificamos que todo esté bien
SELECT *
FROM Fact_Caudal_Disponible;

Recorrer las tablas e insertarlas en una tabla temporal extrayendo la deuda.

Resultado:

8. De la pregunta anterior hacer un pívot de todos los meses, quedando el siguiente


resultado:

Resultado:
Se pueden usar los operadores relacionales PIVOT y UNPIVOT para modificar una expresión
con valores de tabla en otra tabla. PIVOT gira una expresión con valores de tabla al convertir
los valores únicos de una columna en la expresión en varias columnas en la salida. Y PIVOT
ejecuta agregaciones donde se requieren en los valores de columna restantes que se desean
en la salida final. UNPIVOT realiza la operación contraria a PIVOT girando las columnas de
una expresión con valores de tabla a valores de columna.

La sintaxis de PIVOT es más sencilla y legible que la sintaxis que se puede especificar en una
serie compleja de instrucciones SELECT...CASE. Para obtener una descripción completa de la
sintaxis de PIVOT, vea FROM (Transact-SQL).

Sintaxis
La sintaxis siguiente resume cómo se usa el operador PIVOT.

syntaxsql

Copiar
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

9. Explique cual es el proceso para la creación de un CUBO OLAP, si te tiene una base de
datos transaccional ORACLE y una base SQL SERVER (La base de datos SQL sirve como una
base de BI).
Un cubo OLAP es una estructura de datos que supera las limitaciones de las bases de datos relacionales y
proporciona un análisis rápido de datos. Los cubos OLAP pueden mostrar y sumar grandes cantidades de datos, al
mismo tiempo que proporcionan a los usuarios acceso a los puntos de datos para que los datos se puedan agrupar,
segmentar y desglosar según sea necesario para controlar la mayor variedad de preguntas relevantes para el área
de interés de un usuario.

En este artículo, aprendimos cómo crear un cubo en SSAS. Para tal fin, primero necesitamos crear una fuente de
datos para conectarnos a nuestra base de datos. En este ejemplo, nos conectamos a un almacén de datos ya
creado. Para nuestro ejemplo, utilizaremos AdventureworksDW , que es una base de datos de muestra creada con
fines de aprendizaje.

El siguiente paso fue agregar la tabla de hechos y 2 dimensiones como vistas de origen de datos. SSAS detectó las
claves y relaciones principales de forma ya predeterminada.
Después de eso, agregamos 2 dimensiones basadas en 2 vistas de origen de datos. La moneda y las dimensiones del
territorio de ventas.

Finalmente, nosotros creamos un cubo basado en la tabla factresellersales. Seleccionamos algunas columnas como
medidas y agregamos las dimensiones creadas. Con los botones de proceso, cargamos datos a los cubos. El cubo
como se puede ver es una forma sencilla de generar múltiples informes. Usted Puede crear múltiples informes sin
conocimientos de SQL u otras herramientas de informes. Como usted vera Con SSAS puede generar fácilmente
miles de informes para satisfacer las necesidades de su empresa.

10. Hay diferentes tipos de clientes en una cartera de créditos, que criterios usaría para
determinar un cliente BUENO para la generación de campañas (Tome perfiles comerciales y
de riesgo de crédito).

Si lo hace con una modelo explique las funciones principales del programa que usara (R o
Python) y como determinaría el default.

# Dataframe de las probabilidades de incumplimiento


preds_df = pd.DataFrame(preds[:,1], columns = ['prob_default'])

# Estado del préstamo según la probabilidad asignada


preds_df['loan_status'] = preds_df['prob_default'].apply(lambda X: 1 if X > .5
else 0)

# Recuento de filas para cada estado de préstamo


print(preds_df['loan_status'].value_counts())
0 11175
1 609
Name: loan_status, dtype: int64

from sklearn.metrics import classification_report

# Reporte de clasificación
target_names = ['Non-Default', 'Default']
print(classification_report(y_test, preds_df['loan_status'],
target_names=target_names))
precision recall f1-score support

Non-Default 0.81 0.98 0.89 9198


Default 0.71 0.17 0.27 2586

accuracy 0.80 11784


macro avg 0.76 0.57 0.58 11784
weighted avg 0.79 0.80 0.75 11784

Se predijo que casi todo nuestro conjunto de prueba no sería default. El 17 % de los
defaults reales se predijeron correctamente.
Routing:
CREATE ROUTE route_name
[ AUTHORIZATION owner_name ]
WITH
[ SERVICE_NAME = 'service_name', ]
[ BROKER_INSTANCE = 'broker_instance_identifier' , ]
[ LIFETIME = route_lifetime , ]
ADDRESS = 'next_hop_address'
[ , MIRROR_ADDRESS = 'next_hop_mirror_address' ]
[ ; ]

Calculating Beta

Beta is calculated as:

, where Cov(s,m) is the covariance between the asset s and the market m and Var(m), the variance of the market.

In this post, we are using the Redshift flavor of SQL, which does not have a covariance function, so we can explicitly calculate it,

using the formula:

In our case, expected value EE is equivalent to average. Some variants of SQL, such as Postgres and oracle, offer covar_pop.

We have downloaded the historical prices of a stock X and the S&P 500 (date, price) from online and calculated the beta on SQL:
select (sum(s.price*m.price)
- sum(s.price)*sum(m.price)/count(s.price))
/count(s.price)/variance(s.price) as beta
from stock_x s
join sp500 m
on s.date = m.date

Simulating Beta of Portfolio

where ωs are proportions of the respective assets in the portfolio.

We can generate a series to see how the beta changes as we allocate different amounts of stocks in the portfolio. For more

information on generating series, refer to this post. We have generated the series that increment by 0.1 as follows:

with range_vals as
(select
((row_number() over(order by true)) - 1) * 0.1 as n
from sp500
limit 11)
select distinct a.n as x, 1 - a.n as y
from range_vals a

We will use a portfolio of two assets in this example.

with
stock_x_vals as (
select
variance(m.price) as market_variance,
variance(s.price) as variance,
(sum(s.price * m.price)
- sum(s.price) * sum(m.price) / count(s.price))
/ count(s.price) as covariance
from stock_x s
join sp500 m
on s.date = m.date),
stock_y_vals as (...),
stock_a_beta as (
select
covariance / market_variance as beta
from stock_a),
stock_b_beta as (
select
covariance / market_variance as beta
from stock_b),
range_vals as (...),
percs as (...)
select
percs.x,
percs.y,
stock_a_beta.beta * percs.x
+ stock_b_beta.beta * percs.y as beta
from stock_a_beta
cross join stock_b_beta
cross join percs

Variance of Portfolio

Beta measures the risk of an investment that cannot be reduced by diversification, but diversification also helps control the

variance of your portfolio. So in order to fully analyze the risk profile of your portfolio, you will want to calculate the variance as

well. Here we will simulate how these values change depending on your diversification.

Assume our portfolio consists of two assets, X and Y by a and b, respectively.

The variance of our portfolio is then:

We can see how variance changes as we change the portfolio composition with the series we generated earlier.

with
stock_x_vals as (...),
stock_y_vals as (...),
stock_ab as (
select
(sum(s.price * m.price)
- sum(s.price) * sum(m.price) / count(s.price))
/ count(s.price) as covariance
from
stock_x_vals s
join stock_y_vals m
on s.date = m.date),
range_vals as (...),
percs as (...)
select
p.x,
p.y,
p.x * p.x * a.variance + p.y * p.y * b.variance
+ 2 * p.x * p.y * ab.covariance as variance
from percs p
cross join stock_a a
cross join stock_b b
cross join stock_ab ab

Putting all these together in one view, we get:

Stock Y has a higher β, so owning more of stock Y gives you higher beta, but the variance is minimum when the portfolio is more

evenly split between stock X and stock Y.

While the capital asset pricing model (CAPM) implicates that higher beta gives you higher returns since you are taking more risk,

there are studies that indicate a portfolio of lower β provides higher returns, in the long run, founding the basis of value

investment. So here’s your data and now you get to make informed decisions on your portfolio to your own preferences.

También podría gustarte