Registros duplicados

16/02/2008 - 20:28 por daniel | Informe spam
Hola, quisiera saber si alguien me puede explicar detalladamente como
funiona esta sentencia, que es para mostrar los datos duplicados de una
tabla incluyendo todos sus campos, pero no entiendo como funciona.

select * from productos where id_producto not in
(select min(id_producto) from productos as p where productos.nombre_producto
= p.nombre_producto)
order by id_producto

si alguien me puede ayudar gracias.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
16/02/2008 - 21:57 | Informe spam
Hola Daniel,

Al parecer tienes productos con igual [nombre_producto] pero diferente
[id_producto],
por lo que la sentencia selecciona todo producto cuyo [id_producto] no es
igual al minimo [id_producto] de todos aquellos productos con igual nombre a
su nombre. No es necesario usar el operador IN en este caso, ya que la
funcion MIN trae una unica fila.

select *
from productos where id_producto >
(select min(id_producto) from productos as p where productos.nombre_producto
= p.nombre_producto)
order by id_producto

select
a.*
from
productos as a
inner join
(
select nombre_producto, min(id_producto) as min_id_producto
from productos
group by nombre_producto
) as b
on a.nombre_producto = b.nombre_producto
and a.id_producto > b.min_id_producto
order by
a.id_producto

Si usas SQL Server 2005, puedes usar una version mas leible y con mejor
rendimiento.

;with productos_cte
as
(
select
*,
row_number() over(partition by nombre_producto order by id_producto) as rn
from
dbo.productos
)
select *
from productos_cte
where rn > 1
order by rn
GO

AMB



"daniel" wrote:

Hola, quisiera saber si alguien me puede explicar detalladamente como
funiona esta sentencia, que es para mostrar los datos duplicados de una
tabla incluyendo todos sus campos, pero no entiendo como funciona.

select * from productos where id_producto not in
(select min(id_producto) from productos as p where productos.nombre_producto
= p.nombre_producto)
order by id_producto

si alguien me puede ayudar gracias.


Respuesta Responder a este mensaje
#2 daniel
17/02/2008 - 18:20 | Informe spam
Gracias Alejandro.

Ya lo entendi y con el primero y segundo ejemplo que pusiste tambien, pero
en el tercero apesar de que hace lo mismo tendre que entudiar para que sirve
la funcion "row_number()" y las clausulas "over" y "partition by".

Ademas en el tercero estas utilizando un CTE?


"Alejandro Mesa" escribió en el
mensaje de noticias
news:
Hola Daniel,

Al parecer tienes productos con igual [nombre_producto] pero diferente
[id_producto],
por lo que la sentencia selecciona todo producto cuyo [id_producto] no es
igual al minimo [id_producto] de todos aquellos productos con igual nombre
a
su nombre. No es necesario usar el operador IN en este caso, ya que la
funcion MIN trae una unica fila.

select *
from productos where id_producto >
(select min(id_producto) from productos as p where
productos.nombre_producto
= p.nombre_producto)
order by id_producto

select
a.*
from
productos as a
inner join
(
select nombre_producto, min(id_producto) as min_id_producto
from productos
group by nombre_producto
) as b
on a.nombre_producto = b.nombre_producto
and a.id_producto > b.min_id_producto
order by
a.id_producto

Si usas SQL Server 2005, puedes usar una version mas leible y con mejor
rendimiento.

;with productos_cte
as
(
select
*,
row_number() over(partition by nombre_producto order by id_producto) as
rn
from
dbo.productos
)
select *
from productos_cte
where rn > 1
order by rn
GO

AMB



"daniel" wrote:

Hola, quisiera saber si alguien me puede explicar detalladamente como
funiona esta sentencia, que es para mostrar los datos duplicados de una
tabla incluyendo todos sus campos, pero no entiendo como funciona.

select * from productos where id_producto not in
(select min(id_producto) from productos as p where
productos.nombre_producto
= p.nombre_producto)
order by id_producto

si alguien me puede ayudar gracias.


Respuesta Responder a este mensaje
#3 Alejandro Mesa
17/02/2008 - 18:54 | Informe spam
Hola Daniel,

Si, en el tercer ejemplo uso nuevas facilidades introducidas con SQL Server
2005, como son CTE (common table expression) y funciones de ranking
ROW_NUMBER, RANK y DENSE_RANK.


AMB

"daniel" wrote:

Gracias Alejandro.

Ya lo entendi y con el primero y segundo ejemplo que pusiste tambien, pero
en el tercero apesar de que hace lo mismo tendre que entudiar para que sirve
la funcion "row_number()" y las clausulas "over" y "partition by".

Ademas en el tercero estas utilizando un CTE?


"Alejandro Mesa" escribió en el
mensaje de noticias
news:
> Hola Daniel,
>
> Al parecer tienes productos con igual [nombre_producto] pero diferente
> [id_producto],
> por lo que la sentencia selecciona todo producto cuyo [id_producto] no es
> igual al minimo [id_producto] de todos aquellos productos con igual nombre
> a
> su nombre. No es necesario usar el operador IN en este caso, ya que la
> funcion MIN trae una unica fila.
>
> select *
> from productos where id_producto >
> (select min(id_producto) from productos as p where
> productos.nombre_producto
> = p.nombre_producto)
> order by id_producto
>
> select
> a.*
> from
> productos as a
> inner join
> (
> select nombre_producto, min(id_producto) as min_id_producto
> from productos
> group by nombre_producto
> ) as b
> on a.nombre_producto = b.nombre_producto
> and a.id_producto > b.min_id_producto
> order by
> a.id_producto
>
> Si usas SQL Server 2005, puedes usar una version mas leible y con mejor
> rendimiento.
>
> ;with productos_cte
> as
> (
> select
> *,
> row_number() over(partition by nombre_producto order by id_producto) as
> rn
> from
> dbo.productos
> )
> select *
> from productos_cte
> where rn > 1
> order by rn
> GO
>
> AMB
>
>
>
> "daniel" wrote:
>
>> Hola, quisiera saber si alguien me puede explicar detalladamente como
>> funiona esta sentencia, que es para mostrar los datos duplicados de una
>> tabla incluyendo todos sus campos, pero no entiendo como funciona.
>>
>> select * from productos where id_producto not in
>> (select min(id_producto) from productos as p where
>> productos.nombre_producto
>> = p.nombre_producto)
>> order by id_producto
>>
>> si alguien me puede ayudar gracias.
>>
>>


Respuesta Responder a este mensaje
#4 daniel
17/02/2008 - 19:51 | Informe spam
Otra pregunta PARTITION BY es algo asi como GROUP BY que agrupa valores
duplicados?

"Alejandro Mesa" escribió en el
mensaje de noticias
news:
Hola Daniel,

Si, en el tercer ejemplo uso nuevas facilidades introducidas con SQL
Server
2005, como son CTE (common table expression) y funciones de ranking
ROW_NUMBER, RANK y DENSE_RANK.


AMB

"daniel" wrote:

Gracias Alejandro.

Ya lo entendi y con el primero y segundo ejemplo que pusiste tambien,
pero
en el tercero apesar de que hace lo mismo tendre que entudiar para que
sirve
la funcion "row_number()" y las clausulas "over" y "partition by".

Ademas en el tercero estas utilizando un CTE?


"Alejandro Mesa" escribió en el
mensaje de noticias
news:
> Hola Daniel,
>
> Al parecer tienes productos con igual [nombre_producto] pero diferente
> [id_producto],
> por lo que la sentencia selecciona todo producto cuyo [id_producto] no
> es
> igual al minimo [id_producto] de todos aquellos productos con igual
> nombre
> a
> su nombre. No es necesario usar el operador IN en este caso, ya que la
> funcion MIN trae una unica fila.
>
> select *
> from productos where id_producto >
> (select min(id_producto) from productos as p where
> productos.nombre_producto
> = p.nombre_producto)
> order by id_producto
>
> select
> a.*
> from
> productos as a
> inner join
> (
> select nombre_producto, min(id_producto) as min_id_producto
> from productos
> group by nombre_producto
> ) as b
> on a.nombre_producto = b.nombre_producto
> and a.id_producto > b.min_id_producto
> order by
> a.id_producto
>
> Si usas SQL Server 2005, puedes usar una version mas leible y con mejor
> rendimiento.
>
> ;with productos_cte
> as
> (
> select
> *,
> row_number() over(partition by nombre_producto order by id_producto)
> as
> rn
> from
> dbo.productos
> )
> select *
> from productos_cte
> where rn > 1
> order by rn
> GO
>
> AMB
>
>
>
> "daniel" wrote:
>
>> Hola, quisiera saber si alguien me puede explicar detalladamente como
>> funiona esta sentencia, que es para mostrar los datos duplicados de
>> una
>> tabla incluyendo todos sus campos, pero no entiendo como funciona.
>>
>> select * from productos where id_producto not in
>> (select min(id_producto) from productos as p where
>> productos.nombre_producto
>> = p.nombre_producto)
>> order by id_producto
>>
>> si alguien me puede ayudar gracias.
>>
>>


Respuesta Responder a este mensaje
#5 Alejandro Mesa
17/02/2008 - 21:00 | Informe spam
Daniel,

Mas o menos. Supongamos que tienes una tabla de facturas y que quieres hacer
un calculo o proceso por cada cliente, entonces ese es el criterio por el
cual particionas el conjunto o la tabla.

Ejemplo:

Seleccionar la primera orden puesta por cada cliente.

use northwind
go

;with cte
as
(
select *, row_number() over(partition by customerid order by orderdate) as rn
from dbo.orders
)
select *
from cte
where rn = 1

Por cada cliente que alla puesto una orden, ordena y asigna un numero basado
en la fecha en que se puso la orden. Selecciona todas las ordenes cuyo valor
es 1.


AMB


"daniel" wrote:

Otra pregunta PARTITION BY es algo asi como GROUP BY que agrupa valores
duplicados?

"Alejandro Mesa" escribió en el
mensaje de noticias
news:
> Hola Daniel,
>
> Si, en el tercer ejemplo uso nuevas facilidades introducidas con SQL
> Server
> 2005, como son CTE (common table expression) y funciones de ranking
> ROW_NUMBER, RANK y DENSE_RANK.
>
>
> AMB
>
> "daniel" wrote:
>
>> Gracias Alejandro.
>>
>> Ya lo entendi y con el primero y segundo ejemplo que pusiste tambien,
>> pero
>> en el tercero apesar de que hace lo mismo tendre que entudiar para que
>> sirve
>> la funcion "row_number()" y las clausulas "over" y "partition by".
>>
>> Ademas en el tercero estas utilizando un CTE?
>>
>>
>> "Alejandro Mesa" escribió en el
>> mensaje de noticias
>> news:
>> > Hola Daniel,
>> >
>> > Al parecer tienes productos con igual [nombre_producto] pero diferente
>> > [id_producto],
>> > por lo que la sentencia selecciona todo producto cuyo [id_producto] no
>> > es
>> > igual al minimo [id_producto] de todos aquellos productos con igual
>> > nombre
>> > a
>> > su nombre. No es necesario usar el operador IN en este caso, ya que la
>> > funcion MIN trae una unica fila.
>> >
>> > select *
>> > from productos where id_producto >
>> > (select min(id_producto) from productos as p where
>> > productos.nombre_producto
>> > = p.nombre_producto)
>> > order by id_producto
>> >
>> > select
>> > a.*
>> > from
>> > productos as a
>> > inner join
>> > (
>> > select nombre_producto, min(id_producto) as min_id_producto
>> > from productos
>> > group by nombre_producto
>> > ) as b
>> > on a.nombre_producto = b.nombre_producto
>> > and a.id_producto > b.min_id_producto
>> > order by
>> > a.id_producto
>> >
>> > Si usas SQL Server 2005, puedes usar una version mas leible y con mejor
>> > rendimiento.
>> >
>> > ;with productos_cte
>> > as
>> > (
>> > select
>> > *,
>> > row_number() over(partition by nombre_producto order by id_producto)
>> > as
>> > rn
>> > from
>> > dbo.productos
>> > )
>> > select *
>> > from productos_cte
>> > where rn > 1
>> > order by rn
>> > GO
>> >
>> > AMB
>> >
>> >
>> >
>> > "daniel" wrote:
>> >
>> >> Hola, quisiera saber si alguien me puede explicar detalladamente como
>> >> funiona esta sentencia, que es para mostrar los datos duplicados de
>> >> una
>> >> tabla incluyendo todos sus campos, pero no entiendo como funciona.
>> >>
>> >> select * from productos where id_producto not in
>> >> (select min(id_producto) from productos as p where
>> >> productos.nombre_producto
>> >> = p.nombre_producto)
>> >> order by id_producto
>> >>
>> >> si alguien me puede ayudar gracias.
>> >>
>> >>
>>
>>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida