SQL 帮助,获取所需的输出
Posted
技术标签:
【中文标题】SQL 帮助,获取所需的输出【英文标题】:SQL help, Get the desired output 【发布时间】:2015-06-20 18:07:12 【问题描述】:输入:
+---------+---------+--------+ | row_min |最大行数 | tCount | +---------+---------+--------+ | 2 | 4 | 1 | | 7 | 10 | 2 | | 13 | 14 | 3 | +---------+---------+--------+所需输出:
+-----+--------+ |行 | tcount | +-----+--------+ | 2 | 1 | | 3 | 1 | | 4 | 1 | | 7 | 2 | | 8 | 2 | | 9 | 2 | | 10 | 2 | | 13 | 3 | | 14 | 3 | +-----+--------+row_min 和 row_max 在输出中扩展,其范围内有相应的 tcount 此步骤是数据转换的一部分,我需要使用 SQL(驻留在 Amazon redshift 中的数据)对数据集进行操作。我被困在这个特定的步骤上。 请提供相同所需的 SQL 代码,希望仅限于使用连接和分析函数。
【问题讨论】:
这个输出背后有什么逻辑吗? @suslovrow_min
和 row_max
在输出中扩展为相应的 tCount
在其范围内
这不是代码编写服务。到目前为止,您尝试过什么来生成数字序列?
转到 mysql dev.mysql.com/doc/refman/5.0/en/loop.html 的循环以及重复部分 dev.mysql.com/doc/refman/5.0/en/repeat.html。希望你能找到解决办法
@MdJohirulIslam 在 SQL 中,通常使用数字表而不是循环,因为 SQL 旨在声明性而非过程性:Why are numbers tables “invaluable”?。
【参考方案1】:
您可以使用一个足够大的计数表来完成此操作,以包含您表中高达 MAX(row_max)
的数字:
WITH Tally AS (
SELECT ROW_NUMBER() OVER() AS n
FROM (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) x(n)
CROSS JOIN (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) y(n)
)
SELECT n, tCount
FROM Tally AS t
INNER JOIN mytable AS m ON t.n >= m.row_min AND t.n <= m.row_max
我认为 Redshift 支持简单的、非递归的 CTE,所以上面的方法应该可以工作。
Demo here
【讨论】:
以上是关于SQL 帮助,获取所需的输出的主要内容,如果未能解决你的问题,请参考以下文章