鉴于我有一个包含以下非常简单的内容的表:
# select * from messages;
id | verbosity
----+-----------
1 | 20
2 | 20
3 | 20
4 | 30
5 | 100
(5 rows)
我想选择N条消息,其详细程度的总和低于Y(出于测试目的,假设它应该为70,那么正确的结果将是ID为1,2,3的消息)。对我来说真的很重要,该解决方案应该独立于数据库(它至少应在Postgres和SQLite上运行)。
我正在尝试类似的东西:
SELECT * FROM messages GROUP BY id HAVING SUM(verbosity) < 70;
但是,它似乎没有按预期方式工作,因为它实际上并未汇总详细列中的所有值。
对于任何提示/帮助,我将不胜感激。
SELECT m.id, sum(m1.verbosity) AS total
FROM messages m
JOIN messages m1 ON m1.id <= m.id
WHERE m.verbosity < 70 -- optional, to avoid pointless evaluation
GROUP BY m.id
HAVING SUM(m1.verbosity) < 70
ORDER BY total DESC
LIMIT 1;
这假定id
您的示例中有一个独特的,升序的。
在现代Postgres中-或通常在 现代标准SQL中使用 (但在SQLite中 不是 ):
WITH cte AS (
SELECT *, sum(verbosity) OVER (ORDER BY id) AS total
FROM messages
)
SELECT *
FROM cte
WHERE total <= 70
ORDER BY id;
对于只检索少量集合的大表,应该更快。
WITH RECURSIVE cte AS (
( -- parentheses required
SELECT id, verbosity, verbosity AS total
FROM messages
ORDER BY id
LIMIT 1
)
UNION ALL
SELECT c1.id, c1.verbosity, c.total + c1.verbosity
FROM cte c
JOIN LATERAL (
SELECT *
FROM messages
WHERE id > c.id
ORDER BY id
LIMIT 1
) c1 ON c1.verbosity <= 70 - c.total
WHERE c.total <= 70
)
SELECT *
FROM cte
ORDER BY id;
除以外的所有标准功能 LIMIT
。
严格来说,没有“数据库无关”之类的东西。有各种SQL标准,但没有RDBMS完全符合。LIMIT
适用于PostgreSQL和SQLite(和其他一些)。使用TOP 1
的SQL
Server,rownum
用于Oracle。这是Wikipedia上的完整列表。
在SQL:2008标准是:
...
FETCH FIRST 1 ROWS ONLY
… PostgreSQL支持-几乎没有其他RDBMS。
适用于更多系统的纯替代方法是将其包装在子查询中,然后
SELECT max(total) FROM <subquery>
但这是缓慢而笨拙的。
SQL提琴。
问题内容: 假设我有一张桌子: 这将返回自特定日期以来销售数量的产品清单。有没有一种方法不仅可以选择这个和,而且还可以选择没有where条件的和?我想查看每种产品自特定日期以来的销售情况以及所有(没有日期限制)的销售情况。 问题答案:
问题内容: 我需要具有2个字段的django modelform,其中第二个字段选择列表取决于在第一个字段中选择的内容。我的模特: 如果vehicle_type设置为 personal, 如何将 make 字段的选择设置为 PERSONAL_MAKES ?我怎样才能做到这一点?在模型级别上可以吗? __ 问题答案: 您可能不能,因为这取决于用户与表单的交互:您的服务器无法预先知道用户将表单发送到浏
问题内容: 例如,是否可以选择一组元素中的每个第四个元素? 例如:我有16个元素…我可以写类似的东西。 有一个更好的方法吗? 问题答案: 顾名思义,它允许您使用除常数以外的变量构造算术表达式。您可以执行加法(),减法()和系数乘法(其中是整数,包括正数,负数和零)。 这是重写上面的选择器列表的方法: 有关这些算术表达式如何工作的解释,请参见我对该问题的回答以及规范。 请注意,此答案假设同一父元素内
问题内容: 有没有一种方法可以选择特定数量的行而不创建表。例如,如果我使用以下内容: 它将给我10个,我想要10个新行。 谢谢 问题答案: 您可以使用递归CTE在T- SQL中生成任意数字序列,如下所示:
问题内容: 这是桌子:- 而下面是一个 虚构的 sql 预期的结果是:- (一种) (B) (C) 最喜欢’A’的情况! 我知道这种情况与组合有关。 在现实世界中-客户从商店获得商品,并且由于他与商店之间达成协议,他每个星期五都付款。例如,付款金额不是项目的确切总和:他得到5册50钪(= 250钪)的书,而星期五他带来了150册。所以前3本书非常匹配-3 * 50 = 150.我需要找到那三本书的