我有一个包含来自多个交易的数据的表,我一直试图获得每个客户每天最早的记录,调整我在本网站看到的其他解决方案(例如this one),但他们没有为我工作。
表交易是
Time Id Client Price Quantity 1/2/2013 09:33:20 AM 1 Albert 100.00 5,300 1/2/2013 10:34:20 AM 2 Albert 100.90 4,800 1/2/2013 10:34:20 AM 3 Lewis 80.00 25,987 1/2/2013 11:35:23 AM 4 Benson 251.00 700 1/2/2013 14:36:20 AM 5 Albert 100.00 2,250 1/2/2013 15:31:12 AM 6 Albert 99.50 1,340 1/3/2013 09:33:20 AM 7 Benson 250.00 900 1/3/2013 15:13:12 AM 8 Benson 250.00 800 1/3/2013 16:03:55 AM 9 Lewis 80.00 18,890 1/4/2013 09:01:01 AM 10 Albert 101.00 1,190 1/4/2013 09:01:01 AM 11 Albert 100.99 98,890 1/4/2013 09:01:01 AM 12 Lewis 80.98 6,890 1/4/2013 10:51:00 AM 13 Benson 279.18 190 1/4/2013 10:51:00 AM 14 Albert 99.36 78,053 ...
Id是唯一的,并且按照定义按时间顺序排序。时间不是唯一的,这意味着可能有2个交易恰好同时发生。
sql查询需要提取每个客户每天所做的第一笔交易,以及价格和数量,例如:
Date Client Price Quantity 1/2/2013 Albert 100.00 5,300 1/2/2013 Benson 251.00 700 1/2/2013 Lewis 80.00 25,987 1/3/2013 Benson 250.00 900 1/3/2013 Lewis 80.00 18,890 1/4/2013 Albert 101.00 1,190 1/4/2013 Lewis 80.98 6,890 1/4/2013 Benson 279.18 190
有人可以帮我解决如何在SQL中执行此操作吗?
答案 0 :(得分:1)
在SQL Server中,这样的东西应该起作用:
select cast(Time as date), Client, Price, Quantity
from (
select *, row_number()
over (partition by Client, cast(Time as Date) order by Id) [rn]
from transactions
) x where x.rn = 1
这是一个sqlfiddle:http://sqlfiddle.com/#!6/0725d/1
答案 1 :(得分:1)
您没有指定数据库。所以这是一个通用的方法。这个想法适用于大多数数据库,但有些功能不同。
select cast(t.time as date) as "date", t.*
from transactions t
where not exists (select 1
from transactions t2
where cast(t2.time as date) = cast(t.time as date) and
t2.client = t.client and
t2.id < t.id
);
从某个时间获取日期的表达式会有所不同。在某些数据库中,这可能是date(time)
(MySQL)或trunc(time)
(Oracle)或其他。
编辑:
在Access中,这将是:
select CDATE(t.time) as [date], t.*
from transactions t
where not exists (select 1
from transactions t2
where CDATE(t2.time) = CDATE(t.time) and
t2.client = t.client and
t2.id < t.id
);
在MySQL中:
select date(t.time) as "date", t.*
from transactions t
where not exists (select 1
from transactions t2
where date(t2.time) = date(t.time) and
t2.client = t.client and
t2.id < t.id
);