Sql ACCESS 2007:确定跨多列的每行最大值

Sql ACCESS 2007:确定跨多列的每行最大值,sql,ms-access-2007,Sql,Ms Access 2007,我有一个表,每个员工有多个日期列: Emp 1, Date1, Date2, Date3 Emp 2, Date1, Date2, Date3 等等 我想写一个查询,返回每个员工三个可用日期中的最长日期。我知道我需要编写一个UNION ALL查询,但我似乎无法获得语法,以便获得每个员工记录的最大值。我一直为所有员工提供相同的价值。我肯定这是一个愚蠢的错误,但它让我发疯。任何帮助都将不胜感激 感谢您的及时回复!有没有办法不用iif语句就可以做到这一点?如果可能的话,我想对它进行推广

我有一个表,每个员工有多个日期列:

   Emp 1, Date1, Date2, Date3
   Emp 2, Date1, Date2, Date3
等等

我想写一个查询,返回每个员工三个可用日期中的最长日期。我知道我需要编写一个UNION ALL查询,但我似乎无法获得语法,以便获得每个员工记录的最大值。我一直为所有员工提供相同的价值。我肯定这是一个愚蠢的错误,但它让我发疯。任何帮助都将不胜感激


感谢您的及时回复!有没有办法不用iif语句就可以做到这一点?如果可能的话,我想对它进行推广,因为还有几个其他的日期字段,它在计算IIF逻辑时变得非常笨拙


另外,我忘了提到这些日期中的任何一个都可以为空,IIF逻辑似乎返回NULL作为最大值。

这样做是为了: (这是MSSQLS2008,不确定它是否能在Acess中工作)

创建测试数据

create table t1
    ( EmployeeId int,
      Date1  datetime,
      Date2  datetime,
      date3  datetime)

insert into t1 values (1, '2009-10-11', '2009-04-01', '2009-12-25')
insert into t1 values (2, '2009-10-24', '2009-04-03', '2009-12-19')
我的查询

select case 
    when date1 > date2 and DATE1 > date3 then date1
    when date2 > date1 and date2 > date3 then date2
    when date3 > date1 and date3 > date2 then date3
    end as highest
    from t1 

像这样的东西可以: (这是MSSQLS2008,不确定它是否能在Acess中工作)

创建测试数据

create table t1
    ( EmployeeId int,
      Date1  datetime,
      Date2  datetime,
      date3  datetime)

insert into t1 values (1, '2009-10-11', '2009-04-01', '2009-12-25')
insert into t1 values (2, '2009-10-24', '2009-04-03', '2009-12-19')
我的查询

select case 
    when date1 > date2 and DATE1 > date3 then date1
    when date2 > date1 and date2 > date3 then date2
    when date3 > date1 and date3 > date2 then date3
    end as highest
    from t1 

像这样的东西行吗

select
  EmployeeColumn,
  iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3)
from yourTable

像这样的东西行吗

select
  EmployeeColumn,
  iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3)
from yourTable
我知道这不是一个干净的解决方案。
但这正是您在撰写
UNION
时所寻找的

编辑:您可以使用
UNION ALL
而不是
UNION
。使用上述查询,我想它不会对输出产生影响

我知道这不是一个干净的解决方案。
但这正是您在撰写
UNION
时所寻找的


编辑:您可以使用
UNION ALL
而不是
UNION
。使用上述查询,我想它不会对输出产生影响。

如果不想将解决方案限制为SQL,可以使用my iMax()函数:

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    Dim i As Long
    Dim lngUBound As Long
    Dim v As Variant

    v = p(LBound(p))
    lngUBound = UBound(p)
    For i = LBound(p) + 1 To lngUBound
      If v < p(i) Then
         v = p(i)
      End If
    Next
    iMax = v
  End Function
公共函数iMax(ParamArray p())作为变量
“来自Trevor的创意最佳Usenet MessageIDrib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
我想我会坚持多久
朦胧而深沉
Dim v作为变体
v=p(LBound(p))
lngUBound=UBound(p)
对于i=LBound(p)+1到lngUBound
如果v

根据IIf()和Immediate If()的类比,我将其称为“Immediate Max()”,因为它用于查询中的行级处理。

如果不想将解决方案限制为SQL,可以使用我的iMax()函数:

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    Dim i As Long
    Dim lngUBound As Long
    Dim v As Variant

    v = p(LBound(p))
    lngUBound = UBound(p)
    For i = LBound(p) + 1 To lngUBound
      If v < p(i) Then
         v = p(i)
      End If
    Next
    iMax = v
  End Function
公共函数iMax(ParamArray p())作为变量
“来自Trevor的创意最佳Usenet MessageIDrib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
我想我会坚持多久
朦胧而深沉
Dim v作为变体
v=p(LBound(p))
lngUBound=UBound(p)
对于i=LBound(p)+1到lngUBound
如果v

根据IIf()和Immediate If()的类比,我将其称为“Immediate Max()”,因为它用于查询中的行级处理。

哇!我发现它太复杂了,无法做一个简单的:
Max(Field-Constant1,Constant2)

我的目标是:仅根据一个字段计算值,但不要让计算值小于常量

两字段表(KeyField、ValueField)上的EXPLAMP行:

我想要一个返回的select(当Constant1=6和Constant2=1时),我用整个数学来澄清它(我想要的是最后一个=之后最右上方的部分):

所以我只想(当Constant1=6和Constant2=1)以防不够清楚:

1 4
2 1
3 1
4 Null
当心那个空的

我真的想要更复杂的东西,但解决这个问题我就能解决我想要的复杂问题

它可以恢复为: -如果值为Null或不是所用数学运算符的有效值,则返回Null(并非总是仅为a-或a+,等等) -如果可以进行计算,则返回计算值,但仅限于一个范围(不小于一个值,不大于另一个值)

如果我在伪代码上执行此操作,它将如下所示:

try // try to do the maths
   MyCalculatedValue=SomeMaths(FieldValue);
   MyCalculatedValue=Min(Max(MyCalculatedValue,MinValue),MaxValue);
except // In case the SomeMaths can not be done (FieldValue is Null, negative square, division by zero, etc)
      MyCalculatedValue=Null;
end;
return MyCalculatedValue;
以防有人说数据库不规范:我想对一个字段做一些数学运算,然后将结果限制在一个范围内;所以最小的样本数据库只有一个表,只有两个字段(唯一键字段、数据字段),这是不可能完全规范化的;我不是在谈论行上某些字段的最大值,也不是字段上完整表的最大值(聚合函数),只是我想给计算值设置一个下限和一个上限,但是当该值为Null时考虑Null,或者无法对该值进行计算(如Constant1/(FieldValue-Constant2)等情况)

真实样本,以防有人在使用时无法获得:

表字段:

ID (Key)
SpacePosition (DecimalData)
查询所需的结果字段:

ID as ID
Min(Max(SpacePosition-SomeSpaceLongitud,StartPosition),EndPosition) AS RangeStart
Min(Max(SpacePosition+SomeSpaceLongitud,StartPosition),EndPosition) AS RangeEnd
希望这个示例很清晰,希望有人能提供帮助,用一些比使用VBA函数更简单的东西

p.D.:认为这样的数学比+和-,更复杂,表中的寄存器比几个多得多,想想几十亿个寄存器。
P.P.D.:这不是硬编码这样的结果的选项,因为它不会是标准化的数据库,最糟糕的是,这样的范围限制是用户在运行查询时键入的值。

哇!我发现它太复杂了,无法做一个简单的:

Max(Field-Constant1,Constant2)

我的目标是:仅根据一个字段计算值,但不要让计算值小于常量

两字段表(KeyField、ValueField)上的EXPLAMP行:

我想要一个返回的select(当Constant1=6和Constant2=1时),我用整个数学来澄清它(我想要的是最后一个=之后最右上方的部分):

所以我只想(当Constant1=6和Constant2=1)以防不够清楚:

1 4
2 1
3 1
4 Null
当心