【问题标题】:Selecting the highest salary选择最高薪水
【发布时间】:2010-08-22 00:59:42
【问题描述】:

假设工资表:

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

因此,如果 Hour_number 介于低小时或高小时之间,那么这两个查询是完美的。 我需要某种查询,它基本上会执行以下操作:

SELECT wage from wagetable WHERE name LIKE $Employee AND max(highhours)

然后重复“默认”是找不到员工。

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

【问题讨论】:

    标签: sql mysql sqlite


    【解决方案1】:

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

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

    此查询在查询 Brian 时有效,但要使其适用于任何名称,Default 应存储在数据库中,以特殊字符 _-+@ 开头,因为数字和字母在排序中排在第一位。

    另一种方法是为表创建另一列,为了我们的论点,称为priority,对于任何其他用户,Default1 的值应该是 0。然后你可以简单地这样做:

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

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

    【讨论】:

    • 感谢您的详细回答。我会设置一个优先级,因为这个过程看起来最简单。
    • 当然不需要新的专栏。 ORDER BY CASE WHEN name='default' THEN 1 ELSE 0 END DESC, highhours desc 也会这样做吗?
    • @Martin 非常好。我认为在初始化表时在开头设置 1 或 0 会更容易,而不是在每个查询上运行 if else。我确信性能差异很小,但我将在 1 秒内运行此查询 3-4 次
    • @Brian:评估CASE WHEN 可能需要几微秒。从额外的 Priority 列中检索额外的值可能需要几毫秒,即一千倍的时间。 (是的,我知道,我没有考虑缓存……这不是重点。重点是在这种时间量级上担心性能是没有意义的。)
    • @Martin 有趣的方法。我认为它甚至比我的更好。但是如果表格要改变并且会有更多像默认一样的“帐户”,我的方法会不那么复杂。 +1 不少
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2022-01-07
    • 2013-12-04
    • 2016-07-24
    相关资源
    最近更新 更多