假设你有一个这样的数据库:
books
-----
id
name
你想获得数据库中的书籍总数,最简单的sql:
"select count(id) from books"
但是现在你想获得上个月的书总数 ......
编辑:但有些书已经出版了 自上个月以来从表中删除
很明显你已经过了一个月已经过去了 - “books”表总是最新的并且有些记录已被删除
我的方法是在月末运行一个cron作业(或计划任务)并将总计存储在另一个名为report_data的表中,但这看起来很笨拙。有更好的想法吗?
答案 0 :(得分:3)
添加值default column的GETDATE(),将其命名为“DateAdded”。然后,您可以在任意两个日期之间查询以查找该日期期间有多少本书,或者您可以指定一个日期以查明在某个日期之前有多少本书(一直到历史记录)。
每条评论:你不应该删除,你应该soft delete。
答案 1 :(得分:1)
我同意JP,做一个软删除/逻辑删除。对于每个查询一个额外的AND语句,它使一切变得更容易。此外,您永远不会丢失数据。
当然,如果极端尺寸成为问题,那么,你可能不得不开始实际移动/移除行。
答案 2 :(得分:1)
我的方法是在月末运行一个cron作业(或计划任务)并将总计存储在另一个名为report_data的表中,但这看起来很笨拙。
我使用此方法收集和存储历史数据。它比软删除解决方案更简单,因为:
因为执行历史报告的代码与其他使用书籍的代码是隔离的,所以这实际上是不那么笨重的解决方案。
答案 3 :(得分:1)
如果您需要上个月的数据,则不应删除旧数据。相反,您可以进行“逻辑删除”。
我会在表格中添加一个状态字段和一些日期。
books
_____
id
bookname
date_added
date_deleted
status (active/deleted)
从那里你可以查询:
SELECT count(id) FROM books WHERE date_added <= '06/30/2009' AND status = 'active'
注意:我不是最好的架构,但你明白了......;)
答案 4 :(得分:1)
如果更改表的架构太多了,我会添加跟踪更改的触发器。使用这种方法,您可以跟踪各种事物,如添加日期,删除日期等。
答案 5 :(得分:1)
看看你的问题以及不愿意改变架构和代码,我建议你按照你在每个月末计算书籍的想法,并将月份的计数存储在另一个表中。您可以使用数据库调度程序来调用SP来执行此操作。
答案 6 :(得分:1)
您刚刚走过了历史数据库或数据仓库的道路。
数据仓库通常存储有关事物格式的数据,以便以后的数据将被添加到当前数据而不是取代当前数据。有关数据仓库的知识有很多。如果你以严肃的方式走在那条路上,我会推荐Ralph Kimball或Bill Inmon的一本书。我更喜欢Kimball。
以下是网站:http://www.ralphkimball.com/
另一方面,如果您迈出这一领域的第一步是您计划采取的唯一步骤,那么您建议的解决方案就足够了。
答案 7 :(得分:0)
执行所需操作的唯一方法是在books表“date_added”中添加一列。然后你可以运行像
这样的查询select count(id) from books where date_added <= '06/30/2009';