SQL、Order By - 如何赋予其他列更多权限?
-
22-07-2019 - |
题
我有这样的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