3

DB に次のフィールドとデータがあります。

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 を持つアイテムが複数ある場合、結果として最新の日付を持つアイテムは 1 つだけになるはずです。純粋な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

このクエリを純粋な SQL と同じように django で使用した方がよいと思います。

4

3 に答える 3

1

集計に関するドキュメントを参照してください

あなたは次のようなものが欲しいと思います

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

集計クエリに含まれるすべてのフィールドを集計またはグループ化する必要があります。あなたの場合、max(data) と group_by lastname が必要です。ファーストネームにもいくつかの集計を選択する必要があります。たとえば、最大

charfields の集計に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 に答える