Sql 选择最高工资

Sql 选择最高工资,sql,mysql,sqlite,Sql,Mysql,Sqlite,假设赌桌: name lowhours highhours wage Default 0.0 40.0 100 Default 40.0 50.0 150 Default 50.0 70.5 154 Default 70.5 100.0 200 Brian 0.0 40.0 200 Brian 40.0 50.

假设赌桌:

name     lowhours  highhours  wage 
 Default  0.0       40.0       100  
 Default  40.0      50.0       150  
 Default  50.0      70.5       154  
 Default  70.5      100.0      200  
 Brian    0.0       40.0       200  
 Brian    40.0      50.0       250  
 Brian    50.0      60.0       275  
 Brian    60.0      70.0       300  
 Brian    70.0      80.0       325  
 Brian    80.0      9999.0     350  
 Chad     0.0       40.0       130  
 Chad     40.0      9999.0     170 
我目前正在使用此代码(AutoIT脚本:

func getCurrentWage($Employee, $Hour_number)
    Dim  $row
    Local $Wage = 0
    Local $Found = "found"
    _SQLite_QuerySingleRow(-1, "SELECT wage FROM wagetable WHERE name LIKE " & _SQLite_Escape($Employee) & " AND " & _SQLite_Escape($Hour_number) & " BETWEEN lowhours AND highhours;", $row)
    if @error then
        _SQLite_QuerySingleRow(-1, "SELECT wage FROM wagetable WHERE name LIKE 'Default' AND " & _SQLite_Escape($Hour_number) & " BETWEEN lowhours AND highhours;", $row)
        $Found = "not found"
    endif

    If ($row[0] == "") Then Msgbox(0,0,"Error getCurrentWage")
    $Wage = $row[0]

    Debug("Wage='" & $Wage & "'  because " &$Employee&" was "& $Found& " -- and Hours Elapsed is " & $Hour_number, true)
    return $Wage
EndFunc
因此,如果小时数介于低小时或高小时之间,那么这两个查询是完美的。 我需要某种查询,它基本上会执行以下操作:

SELECT wage from wagetable WHERE name LIKE $Employee AND max(highhours)
然后只需重复它,因为“默认”是找不到员工

额外:如果仅通过一个查询未找到$Employee,是否可以尝试使用“默认值”

如果仅通过一个查询未找到$Employee,是否可以尝试使用“默认值”

此查询在查询
Brian
时有效,但如果要对任何名称有效,则应将
默认值
存储在数据库中,以一个特殊字符开始,因为排序时数字和字母排在第一位

另一种方法是为了我们的论证,为表创建另一列,名为
priority
,对于
Default
,该列的值应为
0
,对于任何其他用户,该列的值应为
1

  SELECT name, wage, highhours
    FROM wagetable
   WHERE name like 'Brian' OR
         name like 'Default'
ORDER BY priority desc,
         highhours desc

当然,这是相同的解决方案,但这是一种更好的方法,而不是依赖默认值名称中的特殊字符。

感谢您的详细回答。我将设置优先级,因为这一过程似乎最简单。当然不需要新列。
当name='default'然后1 ELSE 0 END DESC,highhours DESC时按大小写排序。
是否也会这样做?@Martin非常好。我认为在初始化表时,在开始时设置1或0会更容易,而不是在每个查询上运行if-else。我确信性能差异很小,但我将在1中运行此查询3-4次second@Brian:在可能需要几微秒时评估一个
案例ds.从附加的
优先级
列中检索附加值可能需要毫秒,即1000倍长。(是的,我知道,我没有考虑缓存…这不是重点。重点是在这种时间范围内担心性能是没有意义的。)@马丁:这是一个有趣的方法。我认为它比我的更好。但是,如果表格发生变化,会有更多的“账户”如违约,那么我的方法就不会那么复杂了。+1非更少
  SELECT name, wage, highhours
    FROM wagetable
   WHERE name like 'Brian' OR
         name like 'Default'
ORDER BY priority desc,
         highhours desc