我有一个表,其中一列包含类别数据(让我们称其为'category'),另一列包含任意字符串(我们称其为'text')。
现在我想看到每个类别的几个文本示例,换句话说:对于每个类别显示文本的前5个值。文本值不需要按任何标准排序(我不想要前5个最长的字符串或类似的东西),只需要第一个遇到的(随机)字符串。
结果应该如下所示:
+----------+------------------+
| category | text |
+----------+------------------+
| cat A | random string 1 |
| cat A | random string 2 |
| cat A | random string 3 |
| cat A | random string 4 |
| cat A | random string 5 |
| cat B | random string 6 |
| cat B | random string 7 |
| cat B | random string 8 |
| cat B | random string 9 |
| cat B | random string 10 |
| cat C | random string 11 |
| ... | ... |
我不能承受二次复杂性,因为这个表真的很大,有数千万行。
我还希望避免手动联合每个类别的子查询
select ... where category = catA
union
select ... where category = catB
union
select ... where category = catC
union
...
因为有50个不同的类别。
最重要的是,我不能使用任何特定于数据库的特性,因为我的数据库不是任何传统的关系数据库,而是只支持基本SQL语法的Apache Hive。
我知道有很多严格的要求。但如果有人知道如何用简单的SQL解决这个问题,那将会对我有很大帮助。谢谢。
发布于 2019-09-18 18:58:26
您可以在包括配置单元在内的大多数数据库中使用row_number()
。对于每个类别10个示例,例如:
select t.*
from (select t.*,
row_number() over (partition by category order by category) as seqnum
from t
) t
where seqnum <= 10;
发布于 2019-09-19 20:01:23
一般的答案是:如果不支持某种过程语言和优化的GROUP BY操作,就无法做到这一点。
如果数据库系统支持快速SELECT category FROM thetable GROUP BY category
,并且使用过程性语言循环遍历这些值,那么您可以循环遍历GROUP BY的结果,并在每次迭代中添加SELECT * FROM thetable WHERE category = categoryvalue LIMIT 5
的结果。
Apache Hive中的SQL支持包括对未排序SELECT语句的限制。
还有用于SQL CREATE PROCEDURE的HPL/SQL http://www.hplsql.org/udf-sproc。
https://stackoverflow.com/questions/57991139
复制相似问题