我有这样的SQL语句:

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

这只是按日期排序,但我想赋予我的专栏“优先级”更多权限。我怎样才能做到这一点?

它应该首先按日期排序,但如果两条记录之间的时间是 10 分钟,那么我希望优先接管。我如何在 SQL 语句中执行此操作,还是必须在我的应用程序逻辑中执行此操作?我希望我可以在我的 SQL 语句中做到这一点。

谢谢大家的帮助

有帮助吗?

解决方案

您可以将“日期”排序量化为 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要求详细解释......)

取两次跨越 10 分钟边界的时间,例如今天的 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 分钟的较低优先级行,高优先级行就可能出现在几个小时(或几天、或几个月!)前记录的行之前。

其他提示

另一个变体是:

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

你仍然需要不完全是,但非常接近。

假设你真的意味着“两个记录之间的时间是10个mintues [或更少]然后我想优先接管?

然后只是排序10分钟块,然后根据优先级...

选择...点击 顺序按则DateDiff(分钟,0,日期)/ 10,优

可以调整0值来控制,其中每个“TEM分钟块”启动和停止... 如果MySQL不具有DateDiff函数,使用,因为一些参考时间无论在MySQL表达,其提供分钟的计数...

如果您使用的SQL Server2008分之2005时,你可以完成一个递归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

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

SELECT *

这recursive_date_cte

ORDER BY sort_level ASC

, priority DESC

只是改变的顺序语句中的列的顺序

SELECT * FROM converts WHERE email='myemail@googlemail.com' AND status!='1' ORDER BY priority DESC, date ASC
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top