3

我在数据库中有以下字段和数据:

FirstName     LastName    Date

John          Davis       10-10-2011
Joe           Gray        20-09-2011
Ann           Davis       03-04-2010
Ann           Bovis       01-04-2010

如何从具有最新日期和唯一姓氏以及结果中包含的所有其他字段的 DB 3 项目中进行选择。这意味着如果结果中包含多个 LastName Davis 的项目应该只有一个具有最新日期的项目。甚至不知道如何在纯 SQL 上做到这一点——而 Django 看起来根本不可能。

编辑1。SQL 查询。

我在纯 SQL 上编写了查询:

SELECT TOP 3 *
FROM peopleTable as a1
WHERE  (select count(*)FROM peopleTable as a2 where a2.LastName=a1.LastName and a2.Date > a1.Date)<=0
ORDER by Date desc

我想如果我在 django 中使用这个查询就像纯 SQL 一样会更好。

4

3 回答 3

1

请参阅有关聚合的文档

猜你想要类似的东西

Item.objects.values("lastname").annotate(
    date=Max("date"), firstname=Max("firstname"
    ).order_by()

您必须对聚合查询中包含的所有字段进行聚合或分组。在您的情况下,您需要 max(data) 和 group_by 姓氏。您还必须为名字选择一些聚合,比如 max

请注意,似乎有一个关于在字符域上聚合的 postgres错误

于 2011-11-08T16:35:32.123 回答
1

你可以这样做:

最新日期和唯一姓氏

或者

所有其他领域

但你不能两者都做。如果要获取姓氏 Davis 的最近日期,应该检索哪些其他字段,firstname=John 或 firstname=Ann?

你希望结果看起来像这样:

FirstName     LastName    Date

John          Davis       10-10-2011
Joe           Gray        20-09-2011
Ann           Bovis       01-04-2010

Ann Davis 排在哪里,因为她不是桌子上最近的 Davis。正确的?

在这种情况下,您的原始 SQL 类似于:

SELECT FirstName, LastName, Date
FROM
Table T1
WHERE
NOT EXISTS (
SELECT * FROM Table T2 WHERE T2.LastName=T1.LastName AND T2.Date > T1.Date
)

您可以使用Item.objects.raw()选项在 Django 中编写。你也可以使用 extra(where=…)

于 2011-11-08T18:34:19.640 回答
0

您不能真正通过查询来做到这一点。这对 SQL 来说逻辑太多了。但是,基于字典键是唯一的这一事实,您可以通过一点点独创性获得您想要的。

首先,获取按日期升序排序的查询集。这可能看起来违反直觉,因为您想要最新的日期,但在接下来的步骤中它会有意义:

qs = SomeModel.objects.order_by('date')

接下来,我们将在列表推导中使用它来创建(key, value)元组(在 Python 3+ 中,您实际上可以进行字典推导,但由于我认识的人实际上使用 Python 3+ 的人并不多,所以我以这种方式详细说明):

qs_list = [(item.last_name, item) for item in qs]

最后,我们将这个元组列表转换成字典:

items = dict(qs_list)

您现在将拥有一个字典,其中每个 last_name 键都是唯一的。由于字典键必须是唯一的,因此每个重复的姓氏的最后一个值是实际出现的那个。由于列表按日期升序排序,最后一个值是“最新的”。

您可以将此字典转换回直接列表,或者按原样对其进行迭代。唯一的问题是您不再处理 QuerySet,因此您无法执行任何进一步的过滤器等。请记住这一点,并在完全构建查询后最后执行这些步骤。

而且,当然,如果您愿意的话,您可以将所有这些作为一个班轮来完成:

items = dict([(item.last_name, item) for item in SomeModel.objects.order_by('date')])
于 2011-11-08T16:25:31.203 回答