2010-03-20 56 views
1

我有一个JOB表排序,有两个有趣的列:保持数据库表使用多场公式(微软SQL服务器)

  • 创建日期
  • 重要性(高 - 3中2,低 - 1)。这样计算

工作记录的优先级:

Priority = Importance * (time passed since creation) 

的问题是,每次我想挑选200个工作岗位具有最高优先级,而我不希望诉诸表。有没有办法保持行排序?

我也在考虑让高,中,低三个表格有一个,然后按创建日期排序。

回答

3

表不是“排序”;您可以根据您的标准查询数据并添加索引以帮助查找所需的顺序。

(初谎言:表排序;它们存储在簇索引的顺序。)

但是忘记了“重新排序”中的数据的概念。把你的数据放进去,(用一些索引)让数据库服务器完成它的工作来返回你想要的数据。

如果你没有得到你想要的数据,那么你的查询可能需要更多的帮助。

+0

一个很好的答案,但提及'ORDER BY'会改善它。 – RedFilter 2010-03-21 01:33:51

2

问题是,每次我想选择200个最高优先级的工作,而且我不想诉诸表格。有没有办法保持行排序?

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

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

你要在这里的问题是与经营业绩:

假设的SQL Server 2000 +,你可以使用这个查询,而不是引擎将计算表格中每条记录的“重要性*(创建后的时间)”。只要你在函数中有一列,就会发生这种情况。

一个想法。对于更大的表格,获取600行然后从这些行获得前200的开销比执行每个查询的计算要少得多。

SQL是不正确的(按顺序和工会),但这个想法是有效的。

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