CREATE TABLE x (
i serial primary key,
value integer not null,
date timestamp,
category text);
您需要每个类别的最新值。您将:
^{pr2}$
可以通过查询集管理器上的raw方法在django中使用这样的查询:
ModelX.objects.raw("""SELECT DISTINCT ....... FROM x WINDOW w .....""")
要按类别获取最后N个条目,查询稍微复杂一些,并涉及一个子查询:
SELECT i, value, date, category
FROM (SELECT
i, value, date, category,
row_number() over w
FROM x
WINDOW w AS (PARTITION BY category ORDER BY date DESC)) AS subquery
WHERE subquery.row_number <= 30;
看到这一点,你甚至可以看到:
CREATE VIEW x_with_reverse_date_index AS
(SELECT
i, value, date, category,
row_number() over w
FROM x
WINDOW w AS (PARTITION BY category ORDER BY date DESC));
并创建一个django模型来查询此视图:
class ModelX(models.Model):
...
...
row_number = models.IntegerField("Row number when ordering by date desc")
class Meta:
db_table = 'x_with_reverse_date_index'
如果您使用PostgreSQL作为数据库后端,并且不需要跨数据库兼容性,则可以使用允许这样做的powerful window functions:
想象一下你的桌子是这样的:
您需要每个类别的最新值。您将:
^{pr2}$可以通过查询集管理器上的
raw
方法在django中使用这样的查询:要按类别获取最后N个条目,查询稍微复杂一些,并涉及一个子查询:
看到这一点,你甚至可以看到:
并创建一个django模型来查询此视图:
并“正常”查询:
警告:同样,如果需要在另一个数据库引擎上运行的代码,请不要这样做。在
相关问题 更多 >
编程相关推荐