当前位置: 首页 > 面试题库 >

SQL:多次重复结果行,并对行编号

浦德明
2023-03-14
问题内容

我有一个SQL查询,其结果如下:

value | count
------+------
foo   |     1
bar   |     3
baz   |     2

现在,我想扩展它,以便count大于1的每一行都出现多次。我还需要对这些行进行编号。所以我会得到:

value | count | index
------+-------+------
foo   |     1 |     1
bar   |     3 |     1
bar   |     3 |     2
bar   |     3 |     3
baz   |     2 |     1
baz   |     2 |     2

我必须在所有主要数据库(Oracle,SQL
Server,MySQL,PostgreSQL,甚至更多)上都可以完成这项工作。因此,一个可以在不同数据库上工作的解决方案将是理想的选择,但是希望能使它在任何数据库上都能工作的聪明方法。


问题答案:

对于MySQL,使用穷人的generate_series,这是通过视图完成的。MySQL是四大公司中唯一没有CTE功能的RDBMS

实际上,您可以在支持视图的数据库上使用此技术。所以这实际上是所有数据库

生成器技术源自此处:http : //use-the-index-
luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code

我们所做的唯一较小的修改就是我们分别用单纯的乘法和加法替换了原始技术中的按位( 左移按位or )技术。因为Sql
Server和Oracle没有左移运算符。

保证99%的抽象都可以在除Oracle之外的所有数据库上运行;Oracle
SELECT不能没有任何表,为了做到这一点,需要从虚拟表中选择一个,Oracle已经提供了一个表,称为DUAL表。数据库可移植性是梦dream以求的:-)

这是适用于所有RDBMS的抽象视图,在所有主要数据库中都没有按位操作(在这种情况下,这实际上并不是必需的)和细微差别(我们删除OR REPLACECREATE VIEW,仅Postgresql和MySQL支持它们)。

Oracle警告:FROM DUAL在每个SELECT表达式之后

CREATE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1  UNION ALL SELECT 2  UNION ALL 
   SELECT 3   UNION ALL SELECT 4  UNION ALL SELECT 5  UNION ALL
   SELECT 6   UNION ALL SELECT 7  UNION ALL SELECT 8  UNION ALL
   SELECT 9   UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
   SELECT 12  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
   SELECT 15;

CREATE VIEW generator_256
AS SELECT ( ( hi.n * 16 ) + lo.n ) AS n
     FROM generator_16 lo, generator_16 hi;

CREATE VIEW generator_4k
AS SELECT ( ( hi.n * 256 ) + lo.n ) AS n
     FROM generator_256 lo, generator_16 hi;

CREATE VIEW generator_64k
AS SELECT ( ( hi.n * 256 ) + lo.n ) AS n
     FROM generator_256 lo, generator_256 hi;

CREATE VIEW generator_1m
AS SELECT ( ( hi.n * 65536 ) + lo.n ) AS n
     FROM generator_64k lo, generator_16 hi;

然后使用以下查询:

SELECT t.value, t.cnt, i.n
FROM tbl t
JOIN generator_64k i 
ON i.n between 1 and t.cnt
order by t.value, i.n

PostgreSQL:http://www.sqlfiddle.com/#!1
/ 1541d /
1

甲骨文:http :
//www.sqlfiddle.com/#!4/26c05/1

SQL
Server:http://www.sqlfiddle.com/#!6 /
84bee / 1

MySQL:http://www.sqlfiddle.com/#!2 /
78f5b / 1



 类似资料:
  • 因此,我知道的SQL足够危险,因此我正在按照一个示例从表中提取一页的记录: 当然,围绕该页面的SELECT TOP只会拉出当前页面的记录。问题是,我想删除的最里面的SELECT语句中有重复的语句,但是使用DISTINCT不能像上面所示的那样工作,因为这些行已经为外部查询进行了编号。在对行进行编号之前,如何使最内部的SELECT结果不同? 以下是基于以下公认答案的解决方案: 选择前#个参数。perp

  • 我正在php上研究多对多关系,我有3个表,包括电影名称和电影id的movie表genre表包括类型和类型id的movie_genre表包括电影id和类型id的movie_genre表 genre表有这些值 我使用下面的代码来获取数据 但结果将类似于 movie_id movie_name genre[1] movie_id movie_name genre[2] movie_id movie_na

  • 问题内容: 在我的一个Angular控制器中,我有这个: 在另一个控制器中,我有这个: 现在,这是一个单页应用程序。当我最初进入控制器A并尝试触发此事件时, someAction() 将被执行一次。如果我离开并再次返回到控制器A并执行相同的操作,则 someAction() 将执行两次。如果我再做一次,它会发生3次,依此类推。我在做什么错呢? 问题答案: 你可以尝试使用吗?每次创建控制器A时,它都

  • 并行 理论上并行和语言并没有什么关系,所以在理论上的并行方式,都可以尝试用Rust来实现。本小节不会详细全面地介绍具体的并行理论知识,只介绍用Rust如何来实现相关的并行模式。 Rust的一大特点是,可以保证“线程安全”。而且,没有性能损失。更有意思的是,Rust编译器实际上只有Send Sync等基本抽象,而对“线程” “锁” “同步” 等基本的并行相关的概念一无所知,这些概念都是由库实现的。这

  • 我正在学习Scala和Spark,我有一个带有IDS的“tablatemporal”。在Scala中,我希望一行一行地合并一个文本,如下所示:

  • 我正在批量插入同一分区的多行,如果不存在。从我的测试中可以看出,如果任何行是重复的,则所有插入都将失败,并且不会插入任何行。我想保留if不存在行为,但如果存在重复项并且仍然插入非重复行,则不会使批处理失败。有没有办法告诉卡桑德拉,如果有重复项,不要让批处理失败?