我在发电机组中有一张桌子。它存储帐户统计信息。帐户统计信息可能每天都会更新几次。因此表记录可能如下所示:
+------------+--------------+-------+-------+
| account_id | record_id | views | stars |
+------------+--------------+-------+-------+
| 3 | 2019/03/16/1 | 29 | 3 |
+------------+--------------+-------+-------+
| 2 | 2019/03/16/2 | 130 | 21 |
+------------+--------------+-------+-------+
| 1 | 2019/03/16/3 | 12 | 2 |
+------------+--------------+-------+-------+
| 2 | 2019/03/16/1 | 57 | 12 |
+------------+--------------+-------+-------+
| 1 | 2019/03/16/2 | 8 | 2 |
+------------+--------------+-------+-------+
| 1 | 2019/03/16/1 | 3 | 0 |
+------------+--------------+-------+-------+
account_id
是主分区键。
record_id
是主要的排序键
如何仅获取每个account_id
的最新记录?因此,从上面的示例中,我希望得到:
+------------+--------------+-------+-------+
| account_id | record_id | views | stars |
+------------+--------------+-------+-------+
| 3 | 2019/03/16/1 | 29 | 3 |
+------------+--------------+-------+-------+
| 2 | 2019/03/16/2 | 130 | 21 |
+------------+--------------+-------+-------+
| 1 | 2019/03/16/3 | 12 | 2 |
+------------+--------------+-------+-------+
此数据可方便地用于报告目的。
答案 0 :(得分:1)
具有相同分区键的项目存储在同一分区中,并按其排序键排序。因此,如果您反向查询商品并将其限制设置为1,则将获得带有必需的account_id
和最大值record_id
的商品。
因此,请在相关的account_id
上进行查询,但要指定Limit=1
和ScanIndexForward=False
(或Reverse=True
,具体取决于您使用的SDK / API)。
答案 1 :(得分:1)
如果您知道存储在表中的account_id
列表,则可以非常有效地完成此操作。
在这种情况下,您需要做的就是一次查询主键,使用ScanIndexForward=False
对值进行排序,并使用Limit=1
将结果限制为1。
这是python中的代码
import boto3
import json
client = boto3.client('dynamodb')
account_ids = ['1', '2', '3']
results = []
for aid in account_ids:
result = client.query(
TableName='test-table',
KeyConditionExpression="#aid = :aid",
ExpressionAttributeNames={
'#aid': 'account_id'
},
ExpressionAttributeValues={
':aid': {
'N': aid
}
},
ScanIndexForward=False,
Limit=1,
)
results.append(result['Items'])
print(json.dumps(results, indent=2))