如题,一表格会重覆很多次相同的产品值 product_id
但我每个值只取1个
情况1:取每笔数值时间为最新的1笔
情况2:我指定一个时间范围,在范围中取最新的1笔
请问SQL的语法如何实现呢? 感谢各位!
如下 (注意_,时间精准到秒数_)
如果是查询整条数据可以用一下sql
情况一:
SELECT * FROM `tablename` t1
RIGHT JOIN
(SELECT t.`product_id` AS product_id ,MAX(t.`Updatedate`) AS Updatedate
FROM `tablename` t
GROUP BY t.`product_id`) t2
ON t1.`product_id` = t2.`product_id` AND t1.`Updatedate` = t2.`Updatedate`;
情况2:
SELECT * FROM `tablename` t1
RIGHT JOIN
(SELECT t.`product_id` AS product_id ,MAX(t.`Updatedate`) AS Updatedate
FROM `tablename` t
WHERE t.`Updatedate` >'2018-06-07' AND t.`Updatedate`<'2018-06-09'
GROUP BY t.`product_id`) t2
ON t1.`product_id` = t2.`product_id` AND t1.`Updatedate` = t2.`Updatedate`;
写一个存储过程,参数三个,第一个为最新的时间,设置1有效,取最新,第二个第三个参数传入日期参数,有值即为有效。
情况一:SELECT t.product_id
,MAX(t.Updatedate
) FROM tablename
t GROUP BY t.product_id
;
情况二:SELECT t.product_id
,MAX(t.Updatedate
) FROM tablename
t WHERE t.Updatedate
>'2018-06-07' AND t.Updatedate
<'2018-06-09' GROUP BY t.product_id
;
当你发现这个sql很难有效查询的时候就该要从设计上去优化了,你这个sql就算写出来效率也很低。
表中增加一个字段吧,new_flag 1为最新 0为旧数据。每次product_id最新数据保存的时候,更新旧数据为0。
查询时只用查询new_flag = 1的数据就行了
1.SELECT * FROM tb_table WHERE product_id IN(
SELECT distinct product_id FROM tb_table WHERE MAX(Updatedate) GROUP BY product_id
);
2
SELECT * FROM TABLE_NAME T WHERE ROWNUM = 1 GROUP BY T.PRODUCT_ID ORDER BY UPDATEDATE ;
SELECT * FROM TABLE_NAME T
WHERE ROWNUM = 1
AND UPDATEDATE BETWEEN UPDATEDATE1 AND UPDATEDATE2
GROUP BY T.PRODUCT_ID
ORDER BY UPDATEDATE ;
未验证,给与思路
直接按时间倒序排序,取最后的一条limt 1 不就行了
/**
创建添加定义一个要求一:取每一笔值时间为最新的一笔
/
SELECT id,priduct_id, MAX(UpdateDateDate) FROM product GROUP BY priduct_id;
/
创建添加定义一个要求二:指定一个范围内查询这个范围内最新的一笔(方式一)
/
SELECT id,MAX(UpdateDateDate),priduct_id FROM product WHERE UpdateDateDate BETWEEN '2018-01-01' AND '2018-03-04';
/
创建添加定义一个要求二:指定一个范围内查询这个范围内最新的一笔(方式二)
**/
SELECT id,MAX(UpdateDateDate),priduct_id FROM product WHERE UpdateDateDate >='2018-01-01' AND UpdateDateDate<= '2018-03-04';
SELECT * FROM tablename
t1
where not exists (select 1 from tablename
t2 where t1.product_id=t2.product_id and t1.Updatedate<t2.Updatedate)