python - DISTINCT ON 与 ORDER BY 结合返回错误结果

标签 python postgresql sqlalchemy flask-sqlalchemy

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 日有必须显示的较晚数据。

enter image description here

如果我的查询是错误的,我该如何修正这个查询? 我尝试使用 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/

相关文章:

sql - 相当于 Postgresql 的 mysql_insert_id()?

python - flask-sqlalchemy:查询一个表中的记录,在另一个表中没有相关记录(或某个值的记录)

python - 使用 SQLAlchemy 在 Flask 中保存和检索关系的基本示例

python - 在 SQLAlchemy 中过滤大型关系子查询

python - 在 python 中键入提示私有(private)属性的正确方法

python - 类似于 simplejson/json 的 XML 库? - Python

sql - Postgres SQL - 连接具有不同列的表

ruby-on-rails - 更新到最新的 OS X 后出现 Postgres 错误

javascript - urlopen/requests.get 未获取所有页面内容

python - 使用装饰器从类外部动态添加方法