Pregunta

Tengo esta declaración SQL:

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY date ASC, priority DESC

Esto solo ordena por fecha pero quiero dar a mi columna "prioridad" Más autoridad. ¿Cómo puedo hacer esto?

Primero debe ordenar por fecha, pero si el tiempo entre dos registros es de 10 minutos, entonces quiero que la prioridad se haga cargo. ¿Cómo puedo hacer esto en mi declaración SQL o tiene que estar en la lógica de mi aplicación? Esperaba poder hacerlo en mi declaración SQL.

Gracias a todos por cualquier ayuda

¿Fue útil?

Solución

Puede cuantificar el pedido de 'fecha' en fragmentos de 10 minutos, entonces, ¿qué tal si ordena por piso (unix_timestamp (fecha) / 600), y luego por prioridad

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY floor(unix_timestamp(date)/600) ASC, priority DESC

Aunque dos fechas todavía pueden estar separadas por menos de 10 minutos, pero a horcajadas dos pedazos diferentes de 10 minutos. Tal vez eso sea suficiente, pero creo que hacer exactamente lo que solicitas se hace mejor con la aplicación.

(OP solicitó una explicación ampliada ...)

Tómate dos veces que abarcan un límite de diez minutos, como las 9:09 y las 9:11 de hoy:

  • floor (unix_timestamp ('2009-03-16 09: 09 : 00') / 600) = 2061990
  • floor (unix_timestamp ('2009-03-16 09: 11 : 00') / 600) = 2061991

Suponga que tiene una fila de mayor prioridad para 09:11 que 09:09: seguirá apareciendo después de la fila 09:09 porque cayó en el siguiente fragmento de 10 minutos, a pesar de que era solo 2 minutos diferentes.

Entonces, este enfoque es una aproximación, pero no resuelve el problema como se indicó originalmente.

Por la forma en que expresó su problema, una fila de alta prioridad podría aparecer antes de que se registraran varias horas (¡o días o meses!) antes, siempre que hubiera una serie ininterrumpida de fila de menor prioridad con un intervalo de menos de 10 minutos.

Otros consejos

Otra variación sería:

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY (unix_timestamp(date)/60) - priority 

Todavía no es exactamente lo que necesitabas, pero está bastante cerca.

Suponiendo que realmente quisiste decir "el tiempo entre dos registros es de 10 minutos [o menos], ¿entonces quiero prioridad para asumir el control?

luego solo ordena por bloques de diez minutos, y luego por prioridad ...

Seleccione ...
Ordenar por fecha Diferencia (min, 0, Fecha) / 10, Prioridad

puede ajustar el valor 0 para controlar dónde cada bloque de "tem-minute-block" comienza y se detiene ... Si MySql no tiene una función DateDiff, use cualquier expresión en MySQL que proporcione un recuento de minutos desde algún tiempo de referencia ...

Si está utilizando SQL Server 2005/2008, puede realizar esta tarea con un CTE recursivo. Tenga en cuenta que escribí este texto en el bloc de notas y aún no se ha probado. Una vez que tenga la oportunidad de probar los resultados de la consulta, actualizaré el CTE si hay un error o eliminaré este comentario por completo.

WITH date_cte

AS

(SELECT *
    , 'sequential_order' = ROW_NUMBER() OVER
        (PARTITION BY email
        ORDER BY date ASC, priority DESC)
FROM converts
WHERE email = 'myemail@googlemail.com'
AND status <> '1')

, recursive_date_cte

AS

(SELECT dc1.*
    , 'sort_level' = 1
FROM date_cte dc1
WHERE sequential_order = 1
UNION
SELECT dc1.*
    , 'sort_level' = CASE
        WHEN DATEDIFF(MINUTE, dc1.date, dc2.date) <= 10 THEN sort_level
        ELSE sort_level + 1 END
LEFT JOIN date_cte dc2
    ON dc1.sequential_order = dc2.sequential_order - 1
WHERE dc1.sequential_order > 1)

SELECCIONAR *

DE recursive_date_cte

ORDENAR por sort_level ASC

, priority DESC

simplemente cambie el orden o las columnas en la declaración del pedido

SELECT * FROM converts WHERE email='myemail@googlemail.com' AND status!='1' ORDER BY priority DESC, date ASC
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top