Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django如何生成这种SQL?_Python_Sql Server_Django - Fatal编程技术网

Python django如何生成这种SQL?

Python django如何生成这种SQL?,python,sql-server,django,Python,Sql Server,Django,我有以下SQL查询返回我需要的内容: SELECT sensors_sensorreading.*, MAX(sensors_sensorreading.timestamp) AS "last" FROM sensors_sensorreading GROUP BY sensors_sensorreading.chipid 换句话说:获取每个唯一芯片的最后一个传感器读数条目 但我似乎无法找出正确的Django ORM语句来生成此查询。我能想到的最好办法是: SensorReading.obje

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

SELECT sensors_sensorreading.*, MAX(sensors_sensorreading.timestamp) AS "last"
FROM sensors_sensorreading
GROUP BY sensors_sensorreading.chipid
换句话说:获取每个唯一芯片的最后一个传感器读数条目

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

SensorReading.objects.values('chipid')。注释(last=Max('timestamp'))

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

>>>打印连接。查询[-1:]

[{u'time':u'0.475',u'sql':u'SELECT “传感器\传感器读数”“芯片ID”, 最大值(“传感器\传感器读数”“时间戳”)作为“最后一次”从 “sensors_sensorreading”按“sensors_sensorreading”分组。“chipid”}]

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


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

假设表中除了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

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

您的SQL查询不会执行您希望它执行的操作。。。您选择最大时间戳(即组内最新的),但其他字段值将来自组内的其他行。这就是Django ORM不支持该查询的基本原因-因为它不支持该查询-实现该查询的正确方法是什么?我需要每个芯片的最新读数……JamesZ答案中的SQL查询在我看来是正确的,在这种情况下,您需要在Django中使用原始SQL:哇!这看起来很复杂。。。我有一个django替代方案,但是它使用了两个查询:max_set=SensorReading.objects.values('chipid')。注释(last=max('timestamp'))query=Q(),用于max_set:query |=(Q(chipid_-exact=m['chipid'))&Q(timestamp=m['last'])data=SensorReading.objects.filter(查询)