SQL,Order By - 如何赋予其他列更多权限?

Posted

技术标签:

【中文标题】SQL,Order By - 如何赋予其他列更多权限?【英文标题】:SQL, Order By - How to give more authority to other columns? 【发布时间】:2009-03-15 14:43:28 【问题描述】:

我有这个 SQL 语句:

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

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

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

感谢大家的帮助

【问题讨论】:

我认为要求没有明确定义。考虑以下条目: a) 0:0 1 b) 0:7 2 c) 0:14 3 从要求得出: b) 应该在 a) 之前,c) 在 b) 之前,但是 a) 应该在 c 之前)。这对于“之前”的通常定义是不可能的 【参考方案1】:

您可以将“日期”排序量化为 10 分钟的块,那么按 floor(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:

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

假设 09:11 的优先级高于 09:09 - 它仍会出现在 09:09 行之后,因为它属于下一个 10 分钟的块,即使它是只有 2 分钟不同。

所以这种方法是一种近似,但并没有解决最初所说的问题。

按照您陈述问题的方式,高优先级行可能会出现在几个小时(或几天或几个月!)之前记录的行之前,只要有连续的一系列间隔小于 10 分钟的低优先级行。

【讨论】:

天啊,你太棒了!我刚刚执行了那个查询,它正是我需要的输出!我还检查了几个日期在每个日期的 10 分钟内并且优先级列正确接管。你能解释一下为什么你认为这还不够,请保罗:) 我已经扩展了答案来解释【参考方案2】:

另一种变化是:

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

仍然不完全符合您的要求,但非常接近。

【讨论】:

【参考方案3】:

假设您的真正意思是“两条记录之间的时间为 10 分钟 [或更短],那么我希望优先接管?

然后只需按十分钟块排序,然后按优先级...

选择 ... 按 DateDiff(min, 0, Date) / 10, Priority 排序

您可以调整 0 值来控制每个“tem-minute-block”开始和停止的位置... 如果 mysql 没有 DateDiff 函数,请使用 MySQL 中提供自某个参考时间以来的分钟数的任何表达式...

【讨论】:

【参考方案4】:

如果您使用的是 SQL Server 2005 / 2008,您可以使用递归 CTE 完成此任务。请注意我在记事本中写了这段文字,还没有经过测试。一旦我有机会测试查询结果,如果有错误,我将更新 CTE 或完全删除此评论。

与日期_cte

作为

(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

作为

(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

按排序级别 ASC 排序

, priority DESC

【讨论】:

【参考方案5】:

只需更改订单声明中的订单或列

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

【讨论】:

日期必须始终在优先级之前,但当某些日期在 10 分钟内接近每个日期时,优先级需要更多权限:) 响应者似乎没有理解这个问题。但是,我绝对喜欢 Wall-e 的响应者图片。 :P 是的,那是我的问题,我回复后,我更注意了,发现问题是其他的。无论如何,有时有些问题很明显,我认为这是其中之一

以上是关于SQL,Order By - 如何赋予其他列更多权限?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 和 SQL Server 的 ORDER BY 子句中的列无效

sql里 where和order by一起使用是怎样的顺序

SQL order by 分两步

SQL 简单的 ORDER BY

带有 order by 子句的 SQL 查询

SQL order by ASC Second(value) space ASC First(value) 在聚合 SQL 查询的同一列中