我有一个事务表,其中包含不同类型的产品,其中包含两种类型的产品,存储在others字段(json字段)中,标记为product\u type1和product\u type2,有些产品可以同时标记为这两种类型。
事务表:
id, hash_value, product_name,price, date , others
1, abc, product_name1, 20, 2018-10-21, {"product_type1": 1}
2, def, product_name2, 30, 2018-10-22, {"product_type2": 1}
3, ghi, product_name3, 40, 2018-10-21, {"product_type1": 1, "product_type2": 1}
唯一键(id,哈希值)
对于上述表,我们有一个历史表,它将上述产品的历史产品存储在事务表中(模式与事务表相同,但唯一键位于id、哈希值、日期上)
历史记录表
id, hash_value, product_name, price, date , others
1, abc, product_name1, 20, 2018-10-21, {"product_type1": 1}
2, abc, product_name1, 18, 2018-10-20, {"product_type1": 1}
3, abc, product_name1, 19, 2018-10-19, {"product_type1": 1}
4, def, product_name2, 30, 2018-10-22, {"product_type2": 1}
4, def, product_name2, 29, 2018-10-21, {"product_type2": 1}
4, def, product_name2, 40, 2018-10-20, {"product_type2": 1}
5, ghi, product_name3, 40, 2018-10-21, {"product_type1": 1, "product_type2": 1}
5, ghi, product_name3, 50, 2018-10-22, {"product_type1": 1, "product_type2": 1}
我想查询具有以下条件的记录。1获取日期为2018-10-21 2的所有标记为产品类型1的记录。获取日期为2018-10-22 3的所有标记为产品类型2的记录。如果标记为两者,则获取具有最新日期的记录。
我试过的问题。
SELECT *
FROM ((SELECT *
FROM history_table
WHERE date = '2018-10-21'
AND others ->> '$.product_type1' == 1)
UNION ALL
(SELECT *
FROM history_table
WHERE date = '2018-10-22'
AND others ->> '$.product_type2' == 1))
但我得到的结果是
id, hash_value, product_name, price, date , others
1, abc, product_name1, 20, 2018-10-21, {"product_type1": 1}
4, def, product_name2, 30, 2018-10-22, {"product_type2": 1}
5, ghi, product_name3, 40, 2018-10-21, {"product_type1": 1, "product_type2": 1}
5, ghi, product_name3, 50, 2018-10-22, {"product_type1": 1, "product_type2": 1}
如果存在id和哈希值的重复记录,则结果只应给出最新日期的记录
预期结果:
id, hash_value, product_name, price, date , others
1, abc, product_name1, 20, 2018-10-21, {"product_type1": 1}
4, def, product_name2, 30, 2018-10-22, {"product_type2": 1}
5, ghi, product_name3, 50, 2018-10-22, {"product_type1": 1, "product_type2": 1}
1条答案
按热度按时间bwntbbo31#
在派生表(子选择查询)中,标识以下组合的最大日期值:
id
以及hash_value
符合规定的条件。现在,只需将此结果集与
history_table
仅获取与最大日期值对应的行。而不是使用
Union All
组合两种不同的条件选择结果;你可以直接使用OR
在Where
这里的情况。这将大大提高效率。尝试以下查询: