每天的SQL First事务

时间:2014-02-26 18:56:19

标签: sql date ms-access greatest-n-per-group

我有一个包含来自多个交易的数据的表,我一直试图获得每个客户每天最早的记录,调整我在本网站看到的其他解决方案(例如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中执行此操作吗?

2 个答案:

答案 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
                 );