SQL, Упорядочить по - Как дать больше полномочий другим столбцам? - PullRequest
3 голосов
/ 15 марта 2009

У меня есть этот оператор SQL:

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

Это только заказы по дате, но я хочу дать своему столбцу "приоритет" больше прав. Как я могу это сделать?

Сначала следует упорядочить по дате, но если время между двумя записями составляет 10 минут, я хочу, чтобы приоритет занял. Как я могу сделать это в своем операторе SQL или это должно быть в логике моего приложения? Я надеялся, что смогу сделать это в своем операторе SQL.

Спасибо всем за помощь

Ответы [ 5 ]

5 голосов
/ 15 марта 2009

Вы можете квантовать упорядочение по дате в 10-минутные порции, так как насчет упорядочения по полу (unix_timestamp (date) / 600), а затем по приоритету

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

Хотя две даты могут по-прежнему находиться на расстоянии менее 10 минут друг от друга, но находятся между двумя разными 10-минутными «кусками». Может быть, этого достаточно, но я думаю, что именно то, что вы запрашиваете, лучше сделать приложением.

(OP запросил расширенное объяснение ....)

Возьмите два раза, которые пересекают десятиминутную границу, как 9:09 и 9:11 сегодня:

  • этаж (unix_timestamp ('2009-03-16 09: 09 : 00') / 600) = 2061990
  • этаж (unix_timestamp ('2009-03-16 09: 11 : 00') / 600) = 2061991

Предположим, у вас была строка с более высоким приоритетом для 09:11, чем 09:09 - она ​​все равно будет отображаться после строки 09:09, потому что она попала в следующие 10-минутные блоки, даже если она была 2 минуты разные.

Таким образом, этот подход является приблизительным, но не решает проблему, как было первоначально заявлено.

Как вы заявили о своей проблеме, строка с высоким приоритетом может появиться раньше, чем запись, записанная несколькими часами (или днями, или месяцами!) Раньше, если существует непрерывная серия строк с более низким приоритетом с интервалом менее 10 минут.

1 голос
/ 15 марта 2009

Другой вариант будет:

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

Все еще не совсем то, что вам нужно, но довольно близко.

0 голосов
/ 15 марта 2009

Если вы используете SQL Server 2005/2008, вы можете выполнить эту задачу с помощью рекурсивного CTE. Обратите внимание, что я написал этот текст в блокноте, и он еще не был протестирован. Как только у меня будет возможность протестировать результаты запроса, я обновлю CTE, если возникнет ошибка, или вообще уберу этот комментарий.

С 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 * * +1010

(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)

ВЫБРАТЬ *

FROM recursive_date_cte

ORDER BY sort_level ASC

, priority DESC
0 голосов
/ 15 марта 2009

Предполагая, что вы действительно имели в виду, что "время между двумя записями составляет 10 минут [или меньше], тогда я хочу, чтобы приоритет занял?"

затем просто отсортировать по десяти минутам блоков, а затем по приоритету ...

Выбрать ...
Порядок по DateDiff (мин. 0, дата) / 10, приоритет

Вы можете отрегулировать значение 0, чтобы контролировать, где начинается и заканчивается каждый «блок минут-минут» ... Если MySql не имеет функцию DateDiff, использовать любые выражения в MySQL, который обеспечивает отсчет минут с некоторым отсчетом времени ...

0 голосов
/ 15 марта 2009

просто измените порядок или столбцы в выписке заказа

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