Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多字段公式保持数据库表排序(Microsoft SQL Server)_Sql_Sql Server_Tsql_Indexing - Fatal编程技术网

使用多字段公式保持数据库表排序(Microsoft SQL Server)

使用多字段公式保持数据库表排序(Microsoft SQL Server),sql,sql-server,tsql,indexing,Sql,Sql Server,Tsql,Indexing,我有一个JOB表,有两个有趣的列: 创建日期 重要性(高-3,中-2,低-1) 作业记录的优先级计算如下: Priority = Importance * (time passed since creation) 问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序 我也在考虑有三个表格,一个是高、中、低,然后按创建日期排序;您可以根据条件查询数据,并添加索引以帮助查找所需的订单 (第一列:对表进行排序;它们按聚集索引的顺序存储。) 但忘记了“重新排序

我有一个
JOB
表,有两个有趣的列:

  • 创建日期
  • 重要性(高-3,中-2,低-1)
作业记录的优先级计算如下:

Priority = Importance * (time passed since creation)
问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序

我也在考虑有三个表格,一个是高、中、低,然后按创建日期排序;您可以根据条件查询数据,并添加索引以帮助查找所需的订单

(第一列:对表进行排序;它们按聚集索引的顺序存储。)

但忘记了“重新排序”数据的概念。将您的数据放入,然后(通过一些索引)让数据库服务器执行其工作以返回您想要的数据

如果您没有获得所需的数据,那么您的查询可能需要更多帮助。

表没有“排序”;您可以根据条件查询数据,并添加索引以帮助查找所需的订单

(第一列:对表进行排序;它们按聚集索引的顺序存储。)

但忘记了“重新排序”数据的概念。将您的数据放入,然后(通过一些索引)让数据库服务器执行其工作以返回您想要的数据

如果您没有获得所需的数据,那么您的查询可能需要更多帮助

问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序

行顺序与数据库无关,不建议依赖非确定性计算进行排序

假设SQL Server 2000+,则可以改用此查询:

  SELECT TOP 200 t.*
    FROM TABLE t
ORDER BY t.importance * (time passed since creation) DESC
问题是,每次我都想挑选200份优先级最高的工作,我不想诉诸于谈判桌。有没有办法让行保持排序

行顺序与数据库无关,不建议依赖非确定性计算进行排序

假设SQL Server 2000+,则可以改用此查询:

  SELECT TOP 200 t.*
    FROM TABLE t
ORDER BY t.importance * (time passed since creation) DESC

这里的问题是您描述的操作的性能。引擎将为表中的每个记录计算“重要性*(自创建以来经过的时间)”。只要函数中有一列,就会发生这种情况

一个主意。对于较大的表,获取600行然后从中获取前200行的开销比为每个查询执行计算要小得多

SQL不像(order by和unions)那样正确,但是这个想法是有效的

SELECT TOP 200 ident
FROM
(
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 1 AS calc_order
FROM jobs
WHERE priority = 1
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 2 AS calc_order
FROM jobs
WHERE priority = 2
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 3 AS calc_order
FROM jobs
WHERE priority = 3
ORDER BY creation_date
) x
ORDER BY
calc_order DESC

这里的问题是您描述的操作的性能。引擎将为表中的每个记录计算“重要性*(自创建以来经过的时间)”。只要函数中有一列,就会发生这种情况

一个主意。对于较大的表,获取600行然后从中获取前200行的开销比为每个查询执行计算要小得多

SQL不像(order by和unions)那样正确,但是这个想法是有效的

SELECT TOP 200 ident
FROM
(
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 1 AS calc_order
FROM jobs
WHERE priority = 1
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 2 AS calc_order
FROM jobs
WHERE priority = 2
ORDER BY creation_date
UNION ALL
SELECT TOP 200 ident, (GETDATE() - creation_date)  * 3 AS calc_order
FROM jobs
WHERE priority = 3
ORDER BY creation_date
) x
ORDER BY
calc_order DESC

一个好的答案,但提到按排序会使它更好。一个好的答案,但提到按排序会使它更好。