如何在单条Couchbase查询中对同一字段使用双WHERE条件查询?
在Couchbase单条查询实现同一字段多条件统计
你完全可以借助N1QL的条件聚合来搞定这个需求,用SUM(CASE)语句分别筛选符合小时和全天条件的记录,一次性算出两个销售额数值。
假设你的文档结构包含sales(销售额)和timestamp(交易时间)字段,示例如下:
{ "sales": 150, "timestamp": "2024-05-20T16:45:00Z" }
对应的N1QL查询语句如下:
SELECT -- 统计当日目标小时的销售额,这里以16点为例 SUM(CASE WHEN DATE_PART_STR(timestamp, 'hour') = '16' AND DATE_TRUNC_STR(timestamp, 'day') = DATE_TRUNC_STR(NOW(), 'day') THEN sales ELSE 0 END) AS hourly_sales, -- 统计当日总销售额 SUM(CASE WHEN DATE_TRUNC_STR(timestamp, 'day') = DATE_TRUNC_STR(NOW(), 'day') THEN sales ELSE 0 END) AS total_day_sales FROM `your_bucket_name` WHERE -- 先过滤当日数据,减少聚合计算量 DATE_TRUNC_STR(timestamp, 'day') = DATE_TRUNC_STR(NOW(), 'day');
核心逻辑说明:
CASE语句会逐条判断记录是否符合条件:符合则取sales值,不符合则取0- 外层
SUM函数对所有符合条件的sales求和,直接得到两个聚合结果 WHERE子句提前过滤出当日数据,能大幅提升查询效率,避免扫描全量数据
如果你的时间字段是数值型时间戳,只需用FROM_UNIXTIME()转换后再做日期判断,示例如下:
SELECT SUM(CASE WHEN DATE_PART_STR(FROM_UNIXTIME(timestamp), 'hour') = '16' AND DATE_TRUNC_STR(FROM_UNIXTIME(timestamp), 'day') = DATE_TRUNC_STR(NOW(), 'day') THEN sales ELSE 0 END) AS hourly_sales, SUM(CASE WHEN DATE_TRUNC_STR(FROM_UNIXTIME(timestamp), 'day') = DATE_TRUNC_STR(NOW(), 'day') THEN sales ELSE 0 END) AS total_day_sales FROM `your_bucket_name` WHERE DATE_TRUNC_STR(FROM_UNIXTIME(timestamp), 'day') = DATE_TRUNC_STR(NOW(), 'day');
执行这条查询后,就能直接得到你需要的结果格式:
{ "hourly_sales": 500, "total_day_sales": 5000 }
内容的提问来源于stack exchange,提问作者raed abu sada
相关产品推荐
相关产品推荐

