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 代码,希望仅限于使用连接和分析函数。

【问题讨论】:

这个输出背后有什么逻辑吗? @suslov row_minrow_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 帮助,获取所需的输出的主要内容,如果未能解决你的问题,请参考以下文章

考虑到高性能,使用 sql 获得所需的输出?

需要帮助来修改JS代码以实现所需的输出

sql中的case表达式以在用户提示的情况下打印所需的文本

如何减少显示输出所需的加载时间?

如何显示(输出)在二进制搜索树中查找值所需的迭代次数?

主函数跳过线程而不加入以显示所需的输出