查询订单成功时成功尝试的分组

时间:2018-03-26 20:37:21

标签: sql django postgresql django-orm

让我们说,例如,我有一个用于跟踪高跳线的数据库表跳线。它有三个感兴趣的列:attempt_id,athlete和result(跳线是否清除了条形的布尔值)。

我想写一个比较所有运动员的查询。不同尝试的性能产生一个包含此信息的表:尝试次数,清除次数,总尝试次数。换句话说,运动员在x尝试中清除障碍的几率是多少。

编写此查询的最佳方法是什么?它比起初看起来更棘手,因为你需要确定每个运动员的总计最终总数的尝试次数。

我希望用Django ORM编写答案,但SQL也会被接受。

编辑:要明确,我需要通过尝试而不是运动员进行分组。所以所有的运动员都应该这样做。结合x尝试。

1 个答案:

答案 0 :(得分:1)

您可以使用SQL解决它:

SELECT t.attempt_id,
       SUM(CASE t.result WHEN TRUE THEN 1 ELSE 0 END) AS cleared,
       COUNT(*) AS total
  FROM Jumper t
 GROUP BY t.attempt_id

编辑:如果attempt_id只是一个序列,并且您想用它来计算每个跳线的尝试次数,则可以改为使用此查询:

SELECT t.attempt_number,
       SUM(CASE t.result WHEN TRUE THEN 1 ELSE 0 END) AS cleared,
       COUNT(*) AS total
  FROM (SELECT s.*,
               ROW_NUMBER() OVER(PARTITION BY athlete
                                 ORDER BY attempt_id) AS attempt_number
        FROM Jumper s) t
 GROUP BY t.attempt_number

通过这种方式,您可以对所有运动员的每次首次尝试进行分组,所有运动员每次进行第二次尝试,等等...