我有一个JOB
表排序,有两个有趣的列:保持数据库表使用多场公式(微软SQL服务器)
- 创建日期
- 重要性(高 - 3中2,低 - 1)。这样计算
工作记录的优先级:
Priority = Importance * (time passed since creation)
的问题是,每次我想挑选200个工作岗位具有最高优先级,而我不希望诉诸表。有没有办法保持行排序?
我也在考虑让高,中,低三个表格有一个,然后按创建日期排序。
我有一个JOB
表排序,有两个有趣的列:保持数据库表使用多场公式(微软SQL服务器)
工作记录的优先级:
Priority = Importance * (time passed since creation)
的问题是,每次我想挑选200个工作岗位具有最高优先级,而我不希望诉诸表。有没有办法保持行排序?
我也在考虑让高,中,低三个表格有一个,然后按创建日期排序。
表不是“排序”;您可以根据您的标准查询数据并添加索引以帮助查找所需的顺序。
(初谎言:表排序;它们存储在簇索引的顺序。)
但是忘记了“重新排序”中的数据的概念。把你的数据放进去,(用一些索引)让数据库服务器完成它的工作来返回你想要的数据。
如果你没有得到你想要的数据,那么你的查询可能需要更多的帮助。
问题是,每次我想选择200个最高优先级的工作,而且我不想诉诸表格。有没有办法保持行排序?
行顺序与数据库无关,不建议依赖非确定性计算进行排序。你描述它
SELECT TOP 200 t.*
FROM TABLE t
ORDER BY t.importance * (time passed since creation) DESC
你要在这里的问题是与经营业绩:
假设的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
一个很好的答案,但提及'ORDER BY'会改善它。 – RedFilter 2010-03-21 01:33:51