mysql从历史记录表中获取两个不同日期的产品记录,如果发现重复数据,则只包含最新数据

bkhjykvo  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(278)

我有一个事务表,其中包含不同类型的产品,其中包含两种类型的产品,存储在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}
bwntbbo3

bwntbbo31#

在派生表(子选择查询)中,标识以下组合的最大日期值: id 以及 hash_value 符合规定的条件。
现在,只需将此结果集与 history_table 仅获取与最大日期值对应的行。
而不是使用 Union All 组合两种不同的条件选择结果;你可以直接使用 ORWhere 这里的情况。这将大大提高效率。
尝试以下查询:

SELECT ht.* FROM 
history_table AS ht 
JOIN 
(
  SELECT id, hash_value, MAX(date) AS max_date 
  FROM   history_table
  WHERE  (date = '2018-10-21' AND others ->> '$.product_type1' == 1) 
          OR 
         (date = '2018-10-22' AND others ->> '$.product_type2' == 1) 
  GROUP BY id, hash_value 
) AS dt ON dt.id = ht.id AND 
           dt.hash_value = ht.hash_value AND 
           dt.max_date = ht.date

相关问题