有一个table, 里面有Store 名字, 每笔交易(Transaction),交易时间(Updatetime)的信息。
目的:传入Store的名字作为参数,查询到最近一次的交易日期。
例如,传入“Store1”,返回“8/21/2022" 传入”Store2“,返回”8/5/2022"
请教这个function怎么写? 另外这个表有上千万的数据,所以对搜索时间有一定的要求, 至少不能导致 time out
StoreName | Transaction | UpdateTime |
---|---|---|
Store1 | XX | 8/19/2022 |
Store1 | XX | 8/20/2022 |
Store1 | XX | 8/21/2022 |
Store2 | XX | 7/1/2022 |
Store2 | XX | 7/5/2022 |
Store2 | XX | 7/26/2022 |
Store2 | XX | 8/5/2022 |
思路:
你从后台代码中提取到table中Store的值,我看你是c#写的,那么就用textbox.text之类的接受。然后就是对应的把参数拼起来,然后查询数据库。
sql:
select * from table where StoreName=你的textbox.text值 order by UpdateTime desc
数据量大可以把StoreName字段加个索引
你这个需求是返回指定Store的最近交易日期,SQL实现时直接用max函数就可以了。
select max(UpdateTime) as LatestUpdateTime from t where StoreName='传入Store的名字'
当数据量大时需要增加索引。增加索引分两种情况。
场景1.如果你这存储的交易属于低频交易,每个Store的最大交易记录小于1000条,那么只需给StoreName字段增加索引即可。
示例以mysql为例,其他数据库可以百度一下怎么添加索引
-- 语法:ALTER TABLE tbl_name ADD INDEX index_name(column_list)
alter table t add index index_StoreName(StoreName);
场景2.如果你这存储的交易类型属于高频交易,那么就需要增加联合索引,使用StoreName+UpdateTime
联合索引就是多个字段组成的索引,且字段之间有先后顺序。
-- 语法:ALTER TABLE tbl_name ADD INDEX index_name(column_list)
alter table t add index index_StoreName_UpdateTime(StoreName,UpdateTime);
注意联合索引的字段是有先后顺序的,index_StoreName_UpdateTime这里的联合索引针对的是先找到StoreName,然后在找到的结果集内部才能用UpdateTime的索引。在没有StoreName作为条件时,UpdateTime索引就失效了。详细原理可以去搜索一下联合索引的解释。
select TOP 1 * from table where StoreName ='他的名字' order by UpdateTime desc
mysql 版本
```sql
CREATE DEFINER=`root`@`localhost` FUNCTION `func_getMax`(StoreName varchar(200)) RETURNS date
BEGIN
#Routine body goes here...
RETURN (SELECT max(UpdateTime) updateTime from userinfo where StoreName=StoreName);
END
```