我可以做两个select查询:
- select top行customer_id
- 选择与上述customer_id 匹配的所有行
但是,我想知道我是否可以在单个查询中完成上述操作?
我知道可以使用子查询,如
SELECT * FROM customers
WHERE cust_id=(SELECT cust_id FROM customers LIMIT 1)
这是一种有效的方法,还是有更好的方法?
要求是归档属于随机cust_id的记录,或者它可能是最老的cust_id(使用Python中的aws lambda函数周期性运行)。因此,我想在单个事务中获取cust_id和具有相同cust_id的每其他行。
使用Postgres 10.5, DB表定义如下:
id BIGINT PRIMARY KEY,
cust_id VARCHAR(100) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
cust_data JSONB
样本输入
|id|cust_id| cust_data | created |
|--|-------|------------------------|--------------------|
|8 |cust9 |{"a": {"b": "c"}} |25/11/2022 01:05:39|
|25|cust1 |{"x": "y"} |05/12/2022 14:59:21|
|40|cust9 |{"d": {"b": {"c": "z"}}}|07/12/2022 11:29:14|
|87|cust2 |{"r": {"s": "t"}} |13/12/2022 21:10:18|
|99|cust1 |{"p": "q"} |20/12/2022 14:59:21|
预期输出
|id|cust_id| cust_data | created |
|--|-------|------------------------|--------------------|
|8 |cust9 |{"a": {"b": "c"}} |25/11/2022 01:05:39|
|40|cust9 |{"d": {"b": {"c": "z"}}}|07/12/2022 11:29:14|
或
预期输出
|id|cust_id| cust_data | created |
|--|-------|------------------------|--------------------|
|25|cust1 |{"x": "y"} |05/12/2022 14:59:21|
|99|cust1 |{"p": "q"} |20/12/2022 14:59:21|
或
预期输出
|id|cust_id| cust_data | created |
|--|-------|------------------------|--------------------|
|87|cust2 |{"r": {"s": "t"}} |13/12/2022 21:10:18|
在一次查询期间,我们只需要这些预期输出中的一个。还需要说明的是,此处创建的并不是创建该表时的实际时间戳,因为该表中的表项是从另一个表中复制的。所以我认为我们不能确定哪个cust_id拥有最古老的条目
你这样做是对的。
确保使用ORDER BY来确保cust_id不是随机的。
SELECT * FROM customers
WHERE cust_id=(SELECT cust_id FROM customers ORDER BY DATE LIMIT 1)
获取单个任意客户在单个查询中的所有行,WITH TIES
Postgres 13
SELECT *
FROM customers
ORDER BY cust_id
FETCH FIRST 1 ROWS WITH TIES;
如果表比较大,用索引来支持这个查询on(cust_id)
.
:
- 获取最高值的顶部行(s),带领带
Postgres 10在2022年已经达到EOL,所以你需要尽快升级。