Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在编写查询以每“一”选择一行时遇到问题;日期;,在一定条件下_Sql_Ms Access - Fatal编程技术网

Sql 在编写查询以每“一”选择一行时遇到问题;日期;,在一定条件下

Sql 在编写查询以每“一”选择一行时遇到问题;日期;,在一定条件下,sql,ms-access,Sql,Ms Access,在特定条件下,我在编写查询以选择每个“日期”一行时遇到问题。我的表格具有以下结构: ID date expiration callput iv delta 1 1/1/2009 1/20/2009 C 0.4 0.61 2 1/1/2009 1/20/2009 C 0.3 0.51 3 1/1/2009 2/20/2009 C 0.2 0.41

在特定条件下,我在编写查询以选择每个“日期”一行时遇到问题。我的表格具有以下结构:

ID date expiration callput iv delta 1 1/1/2009 1/20/2009 C 0.4 0.61 2 1/1/2009 1/20/2009 C 0.3 0.51 3 1/1/2009 2/20/2009 C 0.2 0.41 ID日期到期callput iv delta 1 1/1/2009 1/20/2009 C 0.40.61 2 1/1/2009 1/20/2009 C 0.30.51 3 1/1/2009 2/20/2009 C 0.20.41 我想编写一个具有以下特征的查询:

  • 对于每一行,计算“天数”,即到期日期减去日期。例如,对于第一行,“天”是19(1/20减去1/1)
  • 结果集应该只有“天”在15到50之间的行
  • “callput”值必须为“C”
  • 对于每个日期,仅显示一行。该行应具有以下特征:
    • 增量应大于0.5
    • 增量应为大于0.5的最小数字
    • 如果有两行,则应选择天数较低的行
以下是上述样本数据的“天数”:

ID date expiration days callput iv delta 1 1/1/2009 1/20/2009 19 C 0.4 0.61 2 1/1/2009 1/20/2009 19 C 0.3 0.51 3 1/1/2009 2/20/2009 50 C 0.2 0.41 ID日期到期日callput iv delta 1 1/1/2009 1/20/2009 19 C 0.40.61 2 1/1/2009 1/20/2009 19 C 0.30.51 3 1/1/2009 2/20/2009 50 C 0.20.41 对于我的示例数据集,答案应该是第2行,因为第2行的“增量”大于0.5,第2行的增量0.51比第1行的0.61更接近0.5,第2行的“天数”19比第3行的“天数”50少

这是我到目前为止写的查询:

SELECT date, Min(delta) AS MaxOfdelta, [expiration]-[date] AS days
FROM RAWDATA
WHERE (((delta)>0.5) AND ((callput)="C") AND (([expiration]-[date])>=15 And ([expiration]-[date])<=50))
GROUP BY date, [expiration]-[date]
ORDER BY date;
选择日期,最小值(增量)为MaxOfdelta,[expiration]-[date]为天
从原始数据

其中(((delta)>0.5)和((callput)=“C”)和(([expiration]-[date])>=15和([expiration]-[date])您可以做的是在子查询中选择正确的行。此查询应该找到您要查找的行:

select [date], min([expiration]-[date])
from rawdata
where delta > 0.5
and callput = 'C' 
and [expiration]-[date] between 15 and 50
group by [date]
要查找属于这些行的增量,请将其放入子查询中并对其进行联接:

select *
from rawdata
inner join (
    select [date]
    ,      min([expiration]-[date]) as days
    from rawdata
    where delta > 0.5
    and callput = 'C' 
    and [expiration]-[date] between 15 and 50
    group by [date]
) as filter 
on filter.date = rawdata.date
and filter.days = rawdata.[expiration] - rawdata.[date]
where delta > 0.5
and callput = 'C' 
要在具有相同“天”的行中搜索最低的增量,可以添加另一个子查询:

select
    SubDaysDelta.date
,   SubDaysDelta.MinDays
,   SubDaysDelta.MinDelta
,   min(rawdata.iv) as MinIv
from rawdata
inner join (
    select 
        SubDays.date
    ,   SubDays.MinDays
    ,   min(delta) as MinDelta
    from rawdata
    inner join (
        select [date]
        ,      min([expiration]-[date]) as MinDays
        from rawdata
        where delta > 0.5
        and callput = 'C' 
        and [expiration]-[date] between 15 and 50
        group by [date]
    ) as SubDays
    on SubDays.date = rawdata.date
    and SubDays.MinDays = rawdata.[expiration] - rawdata.[date]
    where delta > 0.5
    and callput = 'C' 
    group by SubDays.date, SubDays.MinDays
) as SubDaysDelta
on SubDaysDelta.date = rawdata.date
and SubDaysDelta.MinDays = rawdata.[expiration] - rawdata.[date]
and SubDaysDelta.MinDelta = rawdata.delta
where delta > 0.5
and callput = 'C' 
group by SubDaysDelta.date, SubDaysDelta.MinDays, SubDaysDelta.MinDelta
第一个子查询“SubDays”搜索“days”最低的行。第二个子查询“SubDaysDelta”搜索“SubDays”集中的最低增量。外部查询过滤剩余的任何重复项

如果您使用视图,它将更具可读性和可维护性。第一个视图可以根据callput和15-20天的限制进行过滤。这将使它变得更容易。

VBA

我希望我能像安德奥马尔那样彻底、专注、乐于助人。我只能在对他的敬畏中投票支持他的答案

然而,我要指出的是,也许有一些令人信服的理由可以让你转向VBA。即使你是VBA新手,控制和解决问题的好处可能会让你走在前面。我想任何新的学习都会对你项目的其他方面有所帮助


我希望我能像Andomar那样提供一个完整的答案。但是,给它一个重击。

Wow,几乎就是这样!我不得不添加一个“as”和过滤器(就在子查询之后)。然而,访问现在被这行阻塞了:“and filter.days=MIN([expiration]-[date])。它不断地说:“不支持连接表达式”。我遗漏了什么?谢谢!哦,那里不应该有MIN()。编辑了查询。谢谢Andomar!不幸的是,
rawdata
表中有多行具有相同的“天数”。在第一个子查询中是否有方法检索ID列,以便我们可以针对该列进行联接?:-)无法选择ID,因为您没有对其进行分组;而按ID分组将无法达到目的。我能想到的唯一方法是添加另一个子查询。在答案中添加了这个。哇,安多玛,再次感谢你!这很有效!我犯了3个小错误:1。有一些关于“SybDaysDelta”的引用,我将其改为“SubDaysDelta”2。我把上面的“and SubDays.*days*=rawdata.[expiration]-rawdata.[date]”改为“and SubDays.*MinDays*=rawdata.[expiration]-rawdata.[date]”和3。我把“15到20岁”改为“15到50岁”。再次感谢你,安多玛!