Tengo una tabla de pedidos que sé que tienen duplicadosórdenes Encontrar duplicados (por proximidad)
customer order_number order_date
---------- ------------ -------------------
1 1 2012-03-01 01:58:00
1 2 2012-03-01 02:01:00
1 3 2012-03-01 02:03:00
2 4 2012-03-01 02:15:00
3 5 2012-03-01 02:18:00
3 6 2012-03-01 04:30:00
4 7 2012-03-01 04:35:00
5 8 2012-03-01 04:38:00
6 9 2012-03-01 04:58:00
6 10 2012-03-01 04:59:00
Quiero encontrar todos los duplicados (ordenar antes de un mismo cliente dentro de los 60 minutos de entre si). O un conjunto de resultados que consta de las filas "duplicadas" o un conjunto de todos los clientes con un recuento de cuántos duplicados.
Aquí es lo que he tratado
SELECT
customer,
count(*)
FROM
orders
GROUP BY
customer,
DATEPART(HOUR, order_date)
HAVING (count(*) > 1)
Esto no funciona cuando son duplicados dentro de los 60 minutos de diferencia, pero están en diferentes horas es decir, 1:58 y 2:02
I' también hemos probado este
SELECT
o1.customer,
o1.order_number,
o2.order_number,
DATEDIFF(MINUTE,o1.order_date, o2.order_date) AS [diff]
FROM
orders o1 LEFT OUTER JOIN
orders o2 ON o1.customer = o2.customer AND o1.order_number <> o2.order_number
WHERE
ABS(DATEDIFF(MINUTE,o1.order_date, o2.order_date)) < 60
Ahora bien, esto me da todos los duplicados, pero también me da múltiples filas por orden duplicado. es decir, (o1, o2) y (o2, o1) que no sería tan malo si no hubiera algunos pedidos con múltiples duplicados. En esos casos obtengo (o1, o2), (o1, o3), (o2, o1), (o2, o3), (o3, o1), (o3, o2) etc. Obtengo todas las permutaciones.
¿Alguien tiene alguna idea? No necesariamente estoy buscando la mejor respuesta, solo una que funcione.
Usted tiene una dependencia en cascada. Si tiene pedidos que ocurren en '(0, 59, 118, 177, 236, etc.) * [todos los 59 minutos appart] *, ¿cuál quiere que sea el resultado de su búsqueda? – MatBailie
@Dems interesante. Consideraría todos esos duplicados. Sin embargo, estaría contento con el resultado en cualquier caso. –