按行最后10个条目筛选查询?

时间:2018-02-23 11:13:52

标签: sql postgresql

我正在尝试编写一些查询,我希望在最后50个条目中限制它们。

SELECT  CAST(sum(CASE WHEN US.flg_tip THEN 1 ELSE 0 END)AS REAL) / 
            (sum(CASE WHEN US.id_entry > 0 THEN  1 ELSE 0 END) - sum(CASE WHEN A.action = '' THEN 1 ELSE 0 END))
FROM         user AS U, user_statistics AS US, actions AS A
WHERE        US.id_user = U.id_user AND
             AS.id_usertype = 1 AND
             A.id_action = US.id_action AND
             U.id_store = 5 AND
             U.user_name LIKE 'Smith%'
LIMIT 50

然而,LIMIT 50在这种情况下不起作用。

请帮忙。谢谢! 注意(性能很重要,因为它预计可以与大型数据库一起使用)

编辑: 用于计算的SELECT部分​​中的公式基本上是 (提示数量/(条目数量 - 订单数量)

edit2:如我所解释的那样SELECT选择了一些数学函数,它对Smith工作得很好(但对于史密斯的所有行)

如果我想看看史密斯在过去50次访问中的表现如何,我想我可以使用LIMIT 50来获取史密斯数据库中的最后50个条目并让查询进行数学运算并给出一个数字史密斯表现如何使用LIMIT 50进行最后50次访问。

1 个答案:

答案 0 :(得分:1)

如果你想求和最后50个条目,你需要一个子查询:

SELECT CAST(sum(CASE WHEN flg_tip THEN 1 ELSE 0 END)AS REAL) / 
            (sum(CASE WHEN US.id_entry > 0 THEN  1 ELSE 0 END) - 
             sum(CASE WHEN A.action = '' THEN 1 ELSE 0 END)
           )
FROM (SELECT US.*, A.action
      FROM user U JOIN
           user_statistics US
           ON  US.id_user = U.id_user JOIN
           actions A
           ON A.id_action = US.id_action
       WHERE US.id_usertype = 1 AND
             U.id_store = 5 AND
             U.user_name LIKE 'Smith%'
       ORDER BY . . .
       LIMIT 50
      ) u;

注意:

  • 我修复了你古老的连接语法。 始终使用明确的JOIN语法。
  • 如果您想要最后50行,则需要ORDER BY。我不知道哪个列是. . .
  • 的原因
  • 我也修复了无效的表别名。

您可以将外部SELECT简化为:

SELECT (sum( (flg_tip)::numeric ) / 
        (sum( (US.id_entry > 0)::numeric ) - sum( (A.action = '')::numeric ) )
       )