当前位置:  开发笔记 > 数据库 > 正文

编写SQL来查询优先级队列表

如何解决《编写SQL来查询优先级队列表》经验,为你挑选了1个好方法。

我正在实现一个小队列来处理首先运行的进程.我在数据库中使用表来执行此操作.这是表的结构(我在SQLite中嘲笑它):

        "id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
        "identifier" VARCHAR NOT NULL ,
        "priority_number" INTEGER DEFAULT 15,
        "timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP,
        "description" VARCHAR

我正在尝试编写SQL来为我提供下一个可以运行的进程.以下是一些示例数据:

id  identifier  priority_number timestamp   description
1   test1   15  2009-01-20 17:14:49 NULL
2   test2   15  2009-01-20 17:14:56 NULL
3   test3   10  2009-01-20 17:15:03 NULL
4   test4   15  2009-01-20 17:15:08 NULL
5   test5   15  2009-01-20 17:32:23 NULL
6   test6   14  2009-01-20 17:32:30 NULL
7   test7   7   2009-01-20 17:32:38 NULL
8   test8   20  2009-01-20 17:32:57 NULL
9   test9   7   2009-01-21 13:47:30 NULL
10  test10  15  2009-01-21 13:50:52 NULL

如果我使用这个SQL,我可以按正确的顺序获取数据:

select * from queue_manager order by priority_number, timestamp;

这将为我提供顶部具有最低优先级编号(最重要)的项目,并在这些优先级编号中,最早进入顶部的队列(按时间戳).

我可以运行这个查询,只占用第一行,但我宁愿用一个SQL查询来做这个,它会给我位于队列顶部的进程的一行(在上面的示例数据中,行id = 7).

我试过做自我加入和子查询,但我必须有一个心理障碍 - 我似乎无法做到正确.

提前致谢!

编辑

我忘了提到我正在寻找一个独立于数据库的查询.我在SQlite中嘲笑这个,但我很有可能在DB2或Oracle中实现它.我曾想过在我的查询中使用"限制1"类型的运算符,但不同的数据库引擎之间有所不同.



1> Otávio Décio..:

看看这是否有效:

select * from queue_manager where priority_number = 
(select min(priority_number) from queue_manager) and  
timestamp = (select min(timestamp) 
from queue_manager qm2 
where qm2.priority_number = queue_manager.priority_number)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有