Django如何生成这个SQL?

2024-09-28 05:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下返回所需内容的SQL查询:

SELECT sensors_sensorreading.*, MAX(sensors_sensorreading.timestamp) AS "last"
FROM sensors_sensorreading
GROUP BY sensors_sensorreading.chipid

换句话说:获取每个唯一芯片的最后一个传感器读数条目。你知道吗

但我似乎无法找出正确的Django ORM语句来生成这个查询。我能想到的最好办法是:

SensorReading.objects.values('chipid').annotate(last=Max('timestamp'))

但如果我检查它生成的原始sql:

>>> print connection.queries[-1:]

[{u'time': u'0.475', u'sql': u'SELECT "sensors_sensorreading"."chipid", MAX("sensors_sensorreading"."timestamp") AS "last" FROM "sensors_sensorreading" GROUP BY "sensors_sensorreading"."chipid"'}]

如您所见,它几乎生成正确的SQL,除了django只选择chipid字段和聚合“last”(但我需要返回所有表字段)。你知道吗

知道如何返回所有字段吗?你知道吗


Tags: from内容sqlbyasgroupselect芯片
1条回答
网友
1楼 · 发布于 2024-09-28 05:21:45

假设表中除了chipid和timestamp之外还有其他字段,那么我猜这就是您实际需要的SQL:

select * from (
  SELECT *, row_number() over (partition by chipid order by timestamp desc) as RN
  FROM sensors_sensorreading
) X where RN = 1

这将返回每个芯片的最新行以及该行中的所有数据。你知道吗

相关问题 更多 >

    热门问题