Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL/PostgreSQL:如何根据存储在不同表中的限制选择不同类型的有限行数?_Sql_Postgresql - Fatal编程技术网

SQL/PostgreSQL:如何根据存储在不同表中的限制选择不同类型的有限行数?

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

我有一个表(表1),其中第一列是键,第二列包含不同类型的元素。在表1中,有三种类型(类型A、B、C),但实际的数据库有更多的类型

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