我想知道这样的事情是否只在SQL中是可能的。我在这里尝试实现的内容如下:
包含以下列的SQL表:
------------
| DURATION |
|----------|
| 5 |
| 14 |
| 3 |
| 25 |
| . |
| . |
| . |
我希望从小于或大于给定值的每一行中选择满足持续时间总和的所有可能的行集。例如,如果值为20,则小于20的结果应包含3组行
14 +5
5+3
14 + 3
发布于 2019-04-01 09:21:45
这里有一个递归CTE解决方案(需要MySQL 8.0+),用于查找总和小于给定值的行的所有组合。如果您没有MySQL 8,那么您可能需要编写一个存储过程来执行相同的循环。
WITH RECURSIVE cte AS (
SELECT duration,
duration AS total_duration,
CAST(duration AS CHAR(100)) AS duration_list
FROM test
WHERE duration < 20
UNION ALL
SELECT test.duration,
test.duration + cte.total_duration,
CONCAT(cte.duration_list, ' + ', test.duration)
FROM test
JOIN cte ON test.duration > cte.duration AND
test.duration + cte.total_duration < 20)
SELECT duration_list, total_duration
FROM cte
WHERE duration_list != total_duration
ORDER BY total_duration ASC
我的demo on dbfiddle的示例输出
duration_list total_duration
2 + 3 5
2 + 5 7
3 + 5 8
2 + 8 10
2 + 3 + 5 10
3 + 8 11
2 + 11 13
5 + 8 13
2 + 3 + 8 13
3 + 11 14
2 + 5 + 8 15
5 + 11 16
2 + 3 + 11 16
3 + 5 + 8 16
2 + 14 16
3 + 14 17
2 + 5 + 11 18
2 + 3 + 5 + 8 18
2 + 3 + 14 19
3 + 5 + 11 19
8 + 11 19
5 + 14 19
发布于 2019-04-01 09:07:05
考虑在两个字段总和小于零的条件下避免反向重复的自联接。注意:这只返回两对组合。
SELECT t1.DURATION, t2.DURATION
FROM myTable t1
LEFT JOIN myTable t2
ON t1.DURATION < t2.DURATION
WHERE t1.DURATION + t2.DURATION < 20
发布于 2019-04-01 09:06:21
你可以使用Common Table Expressions来解决这个问题。您应该安装了MySQL 8.0。
见下文。
WITH cte (duration) AS (
SELECT duration
FROM your_table
WHERE duration < 20
)
SELECT a.duration + b.duration AS 'sum_of_val'
FROM cte a JOIN cte b
WHERE a.duration + b.duration < 20
如果您的其他版本不支持CTE,则可以使用子查询。
见下文。
SELECT a.duration + b.duration AS 'sum_of_val'
FROM (select duration from your_table where duration < 20 ) a
JOIN (select duration from your_table where duration <20 ) b
WHERE a.duration + b.duration < 20
https://stackoverflow.com/questions/55446751
复制相似问题