Sql 如果在一个大数据集中有上表,您将如何有效地检索当天的第一组头寸

Sql 如果在一个大数据集中有上表,您将如何有效地检索当天的第一组头寸,sql,data-retrieval,Sql,Data Retrieval,有一个表定义为: CREATE TABLE[Positions]( [load_id] [int] NOT NULL, [acct_cd] [varchar](20) NOT NULL, [acct_num] [varchar](255) NULL, [sec_id] [

有一个表定义为:

CREATE TABLE[Positions](
            [load_id]           [int]                  NOT NULL, 
            [acct_cd]         [varchar](20)   NOT NULL,
            [acct_num]      [varchar](255)             NULL,
            [sec_id]            [varchar](50)   NOT NULL,
            [long_sht_cd]   [varchar](3)     NOT NULL,
            [sedol]              [varchar](15)   NULL,
            [isin]                 [varchar](15)   NULL,
            [cusip]              [varchar](9)     NULL,
            [sec_type]       [varchar](8)     NULL,
            [sec_name]     [varchar](100)NULL,
            [currency_cd] [varchar](3)     NULL,
            [total_holding] [decimal](18, 4)NULL,
            [mkt_price]      [float]               NULL,
            [datetime_stamp] [datetime]   NULL,
CONSTRAINT [pk_Positions] PRIMARY KEY CLUSTERED(       
[load_id] ASC, 
            [acct_cd] ASC, 
            [sec_id] ASC,
            [long_sht_cd] ASC )
)
此表保存每天多次追加的帐户头寸数据 目前表中约有2400万行。每次我们添加额外的位置时,我们会将大约32000个条目添加到此表中,并且所有32000个条目都将具有相同的load_id。每次我们加载一批32000个条目时,load_id将增加一个,即前32K个条目的load_id=1,下一个32K的load_id=2,等等。。。。datetime_stamp字段显示加载条目的时间,对于单个加载中的所有32K条目的时间相同

根据上表的定义,您如何有效地检索当天的第一组头寸

例如: 今天,在上午8点、上午10点和下午3点将仓位加载到此表中。今天下午5点,我们想知道上午8点加载了哪些位置,因为这是今天发生的第一次加载。请注意,对于任何给定的一天,可能会有不同数量的负载,负载发生的时间也会有所不同。

以下是一种方法:

select p.*
from (select p.*, dense_rank() over (order by datetime) as seqnum
      from positions p
      where p.datetime >= @date and p.datetime < @date + interval '1 day'
    ) p
where seqnum = 1;
这是相当不可知的数据库

在SQL Server中,您可能会发现这是最好的:

select top (1) with ties p.*
from positions p
where p.datetime >= @date and p.datetime < dateadd(day, 1, @date)
order by p.datetime;
positionsdatetime上的索引将起作用,但可能更适用于where而不是order by。

这里有一种方法:

select p.*
from (select p.*, dense_rank() over (order by datetime) as seqnum
      from positions p
      where p.datetime >= @date and p.datetime < @date + interval '1 day'
    ) p
where seqnum = 1;
这是相当不可知的数据库

在SQL Server中,您可能会发现这是最好的:

select top (1) with ties p.*
from positions p
where p.datetime >= @date and p.datetime < dateadd(day, 1, @date)
order by p.datetime;

positionsdatetime上的索引将起作用,但可能更多地用于where而不是order by。

现在您有了日期-时间戳字段,但上面没有索引,我想您最感兴趣的是最后一天的两天数据。在这种情况下,您可能希望有一个职位日期新日期类型字段,并在此职位日期和加载id上建立索引。然后您可以高效地查询特定日期的记录并在当天批量加载。

现在您有了日期时间戳字段,但是上面没有索引,我想你最感兴趣的是最后两天的数据。在这种情况下,您可能需要一个职位日期新日期类型字段,并在此职位日期和加载id上建立索引。然后您可以高效地查询特定日期的记录并在当天批量加载。

您的表中有一个reduncandy,因为加载id决定日期时间戳。考虑使用DeTeMeMyStand保持负载表,只需使用表中的Load Syd。< /P> 对于SQL Server,这将起作用,对于其他RDBMS,更改数据类型将起作用。我只是把当前日期的时间缩短了。我用PL/SQL可以做得更好

select *
from Positions
where datetime_stamp=(select min(datetime_stamp) from positions where datetime_stamp between 
cast(CAST(GETDATE() as date) as datetime2) and 
dateadd(MS,-1,cast(dateadd(day,1,CAST(GETDATE() as date)) as datetime2))
)

您的表中有一个reduncandy,因为load\u id决定日期时间戳。考虑使用DeTeMeMyStand保持负载表,只需使用表中的Load Syd。< /P> 对于SQL Server,这将起作用,对于其他RDBMS,更改数据类型将起作用。我只是把当前日期的时间缩短了。我用PL/SQL可以做得更好

select *
from Positions
where datetime_stamp=(select min(datetime_stamp) from positions where datetime_stamp between 
cast(CAST(GETDATE() as date) as datetime2) and 
dateadd(MS,-1,cast(dateadd(day,1,CAST(GETDATE() as date)) as datetime2))
)

你能添加一些样本数据吗。尽可能插入。用您正在使用的数据库标记您的问题。您可以添加一些示例数据吗。尽可能插入。用您正在使用的数据库标记您的问题。