SQL/PostgreSQL:如何根据存储在不同表中的限制选择不同类型的有限行数?
我有一个表(表1),其中第一列是键,第二列包含不同类型的元素。在表1中,有三种类型(类型A、B、C),但实际的数据库有更多的类型SQL/PostgreSQL:如何根据存储在不同表中的限制选择不同类型的有限行数?,sql,postgresql,Sql,Postgresql,我有一个表(表1),其中第一列是键,第二列包含不同类型的元素。在表1中,有三种类型(类型A、B、C),但实际的数据库有更多的类型 Table.1. A minimal example. _________________ | | | |_KEY| attribute | |____|___________| |k1 | A | |k2 | A | |k3 | B | |k4 | C | |k
Table.1. A minimal example.
_________________
| | |
|_KEY| attribute |
|____|___________|
|k1 | A |
|k2 | A |
|k3 | B |
|k4 | C |
|k5 | C |
|____|___________|
来自表1;我只对从每种类型中检索有限数量的元素感兴趣。表2提供了给定类型的有限元素数量,其中元素类型是表的键(_元素)
澄清;从表1中获得的A类元素的有限数量。在这个最小的例子中是1。同样,B型为2,C型为1
Table 2. Limits of item to obtain for each type in table 1.
____________________
| _Element | Limit |
|----------|-------|
| A | 1 |
| B | 2 |
| C | 1 |
|__________|_______|
最后,应该从表1从上到下检索元素
感谢您的帮助和/或指点/gus
p.S.
对于上述最小示例,预期输出为
___________________
| Key| Attribute |
|____|____________|
| k1 | A |
| k3 | B |
| K4 | C |
|____|____________|
因为对于这个特定的最小示例,只有1个C属性。请注意,如果存在,例如5种C型元素,则应获得下表(因为C型元素的限量为2)
你可以通过工会来做这件事
select top (SELECT Limit FROM Table2 WHERE _Element='A') * from Table1
WHERE attribute = A
UNION ALL
select top (SELECT Limit FROM Table2 WHERE _Element='B') * from Table1
WHERE attribute = B
UNION ALL
select top (SELECT Limit FROM Table2 WHERE _Element='C') * from Table1
WHERE attribute = C
或使用行号:
with cte as (SELECT _Key,
attribute,
ROW_NUMBER() OVER (Partition by attribute Order by _Key ASC) as rowno
From Table1)
SELECT * FROM cte
LEFT JOIN Table2 on Table2.Element = Table1.attribute
WHERE rowno >= Limit
我真的很喜欢PostgreSQL数组的强大功能。所以
select
table2._element,
unnest((array_agg(table1._key order by table1._key desc)[1:table2.limit])) as _key
from
table1 join table2 on (table1.attribute = table2._element)
group by
table2._element, table2.limit
其中,在查询的第二个字段中:
array\u agg(表1.\u key order by table1.\u key desc)
-按指定顺序将值收集到数组中(请注意,order by table1.\u key desc
只是一个示例,您可以跳过它或指定另一个)
(…)[1:table2.limit]
-返回从1到table2.limit的数组元素
unnest(…)
-将以前的结果展开为行 基于该样本数据,您的预期输出是什么?是的,您能给我们一个输出示例,以便我们能更好地提供帮助吗?谢谢。我已经更新了O.P.On Thinks,另一条评论(似乎已经消失了!)建议使用count更合适。谢谢Ed!第一种方法不起作用,因为实际数据库中有更多的属性。我现在正在研究你的第二个解决方案。
select
table2._element,
unnest((array_agg(table1._key order by table1._key desc)[1:table2.limit])) as _key
from
table1 join table2 on (table1.attribute = table2._element)
group by
table2._element, table2.limit