miércoles, 27 de junio de 2012

Borrar Filas Duplicadas


Siempre es bueno tener una llave única en las tablas del sistema; pero en algunos casos, cuando las llaves son autonumericas o no tiene llave, las inserciones se pueden volver un problema cuando los registro son repetidos y no hay forma de identificar uno del otro, sino solamente por la autonumerica o por el rowid.
Puedes eliminar los registros uno a uno, o con uno de los siguientes script’s:
Borra todos los registros que no esten en los minimos de la misma tabla.
DELETE FROM departamento
WHERE rowid NOT IN(
       SELECT MIN(rowid)
          FROM departamento d
      GROUP BY D.departamento_id
)

Similar a la anterior, pero sin el NOT IN
DELETE FROM departamento A
WHERE ROWID > (
SELECT min(rowid)
FROM departamento BWHERE A.departamento_id = B.departamento_id);

Ahora con Exists


DELETE FROM departamento A
WHERE EXISTS
(
SELECT ‘x’
FROM departamento B
WHERE A.departamento_id = B.departamento_id
AND B.rowid > A.rowid);


Teletrabajo


Ya existe en Colombia una ley que reglamenta el teletrabajo con las mismas garantías de un trabajador presencial; este es un resumen del reglamento:

Encontrar el 2do o N valor mas alto o mas bajo


Es fácil encontrar el valor mas alto o mas bajo de una consulta de datos con las funcionas max() y min(); pero cuando se necesita el segundo o tercer valor mas alto, la cosa cambia un poco, de esta forma:
select id from
(select rownum r, id
from trabajo
order by id desc)
where r=2;
De esa forma tendremos la consulta ordenada de forma descendente pero tomando a partir de la fila 2.

Grouping Sets Oracle


Grouping Sets es una extension del Group By, esta permite crear cortes de agrupaciones en un listado de datos agrupados; por ejemplo, si queremos totalizar una consulta por departamento y trabajo, grouping sets haria un corte cada vez que cambie uno de los campos segun el orden que sean escritos y totalizaria lo que lleva hasta el momento. Dichas columnas de agrupacion seran nulas y el campo de agrupacion del select sera el totalizado:
SELECT fact_1_id,
       fact_2_id,
       fact_3_id,
       SUM(sales_value) AS sales_value,
       GROUPING_ID(fact_1_id, fact_2_id, fact_3_id) AS grouping_id
FROM   dimension_tab
GROUP BY GROUPING SETS((fact_1_id, fact_2_id), (fact_1_id, fact_3_id))
ORDER BY fact_1_id, fact_2_id, fact_3_id;

 FACT_1_ID  FACT_2_ID  FACT_3_ID SALES_VALUE GROUPING_ID
---------- ---------- ---------- ----------- -----------
         1          1                4363.55           1
         1          2                4794.76           1
         1          3                4718.25           1
         1          4                5387.45           1
         1          5                5027.34           1
         1                     1      2737.4           2
         1                     2     1854.29           2
         1                     3     2090.96           2
         1                     4     2605.17           2
         1                     5     2590.93           2
         1                     6      2506.9           2
         1                     7     1839.85           2
         1                     8     2953.04           2
         1                     9     2778.75           2
         1                    10     2334.06           2
         2          1                5652.84           1
         2          2                4583.02           1
         2          3                5555.77           1
         2          4                5936.67           1
         2          5                4508.74           1
         2                     1     3512.69           2
         2                     2     2847.94           2
         2                     3      2972.5           2
         2                     4     2534.06           2
         2                     5     3115.99           2
         2                     6     2775.85           2
         2                     7     2208.19           2
         2                     8     2358.55           2
         2                     9     1884.11           2
         2                    10     2027.16           2