results = Tracking.query. \
filter(Tracking.time >= datetime.strptime(date_1, '%d-%m-%Y'),).\
filter(Tracking.time <= datetime.strptime(date_2, '%d-%m-%Y')).\
order_by(Tracking.device_id, desc(func.date(Tracking.time))). \
distinct(Tracking.device_id, func.date(Tracking.time))
我有像上面这样的查询,但是像这样在早期得到唯一真实的结果
[
{
"device_id": 1,
"device_serial_number": "213123",
"id": 31419,
"latitude": "-6.1486514",
"longitude": "106.894557",
"time": "Mon, 19 Mar 2018 14:35:20 GMT",
"video_id": 1,
"video_name": "dubstep",
"video_path": "http://localhost:5000/public/files/DubstepBirdOriginal5SecVideo.mp4"
},
{
"device_id": 1,
"device_serial_number": "213123",
"id": 13000,
"latitude": "-6.1509214",
"longitude": "106.89634459999999",
"time": "Sat, 17 Mar 2018 00:00:05 GMT",
"video_id": 1,
"video_name": "dubstep",
"video_path": "http://localhost:5000/public/files/DubstepBirdOriginal5SecVideo.mp4"
},
{
"device_id": 1,
"device_serial_number": "213123",
"id": 12988,
"latitude": "-6.151098",
"longitude": "106.89603483333333",
"time": "Fri, 16 Mar 2018 23:59:43 GMT",
"video_id": 1,
"video_name": "dubstep",
"video_path": "http://localhost:5000/public/files/DubstepBirdOriginal5SecVideo.mp4"
}
]
3 月 16 日有正确的结果,但其他人没有,如下图所示:3 月 17 日和 19 日有必须显示的较晚数据。
如果我的查询是错误的,我该如何修正这个查询? 我尝试使用 order by 和 group by,结果相同。
最佳答案
您在订购时将时间戳 Tracking.time
截断为日期,因此具有相同设备 ID 和日期部分的行将按未指定的顺序相对于每个行其他。然后 DISTINCT ON 将选择最先出现的行。
您必须以某种方式将时间添加到您的订购中。一个快速而肮脏的解决方案是将时间戳添加为第三个排序表达式:
results = Tracking.query. \
filter(Tracking.time >= datetime.strptime(date_1, '%d-%m-%Y')).\
filter(Tracking.time <= datetime.strptime(date_2, '%d-%m-%Y')).\
order_by(Tracking.device_id,
func.date(Tracking.time).desc(),
Tracking.time.desc()).\
distinct(Tracking.device_id, func.date(Tracking.time))
或者,您可以将时间戳转换为时间:
from sqlalchemy import Time
results = Tracking.query. \
...
order_by(Tracking.device_id,
func.date(Tracking.time).desc(),
Tracking.time.cast(Time).desc()).\
关于python - DISTINCT ON 与 ORDER BY 结合返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49357971/