首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SQL使用列的值选择所有可能的行集

使用SQL使用列的值选择所有可能的行集
EN

Stack Overflow用户
提问于 2019-04-01 08:35:26
回答 3查看 108关注 0票数 0

我想知道这样的事情是否只在SQL中是可能的。我在这里尝试实现的内容如下:

包含以下列的SQL表:

------------
| DURATION |
|----------|
|     5    |
|    14    |
|     3    |
|    25    |
|     .    |
|     .    |
|     .    |

我希望从小于或大于给定值的每一行中选择满足持续时间总和的所有可能的行集。例如,如果值为20,则小于20的结果应包含3组行

14 +5

5+3

14 + 3

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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
票数 2
EN

Stack Overflow用户

发布于 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
票数 3
EN

Stack Overflow用户

发布于 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55446751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档