【问题标题】:Compare two values in SQL Server比较 SQL Server 中的两个值
【发布时间】:2016-11-01 13:44:50
【问题描述】:

我正在尝试获取两组之间最后到达的值。这是我正在开发的代码

USE KronosNET22
GO

Select distinct 
    dbo.[Object].Name, dbo.[ObjectSignal_2016_07_22].Code,
    MAX(dbo.[ObjectSignal_2016_07_22].TimeIn) as tiempo
from 
    dbo.[Object],dbo.[ObjectSignal_2016_07_22]
where 
    dbo.[Object].IdClient = '6C74F97C-7253-415D-96B1-4B902D8334D7'
    and (dbo.[ObjectSignal_2016_07_22].Code = 'ON3' or 
         dbo.[ObjectSignal_2016_07_22].Code = 'OFF3' or 
         dbo. [ObjectSignal_2016_07_22].Code = 'E401' or 
         dbo.[ObjectSignal_2016_07_22].Code = 'R401')
    and dbo.[Object].Name = dbo.[ObjectSignal_2016_07_22].ObjectName
group by 
    dbo.[Object].Name, dbo.[ObjectSignal_2016_07_22].Code
order by 
    dbo.[Object].Name, MAX(dbo.[ObjectSignal_2016_07_22].TimeIn) desc

这就是我得到的结果

AV CHILE PORCIUNCULA    ON3 1469211062
AV CHILE PORCIUNCULA    OFF3    1469195866
CALIMA  ON3 1469230879
CALIMA  OFF3    1469217492
CAMPANARIO POPAYAN  ON3 1469210662
CAMPANARIO POPAYAN  OFF3    1469203155
EL PROGRESO -- DOS QUEBRADAS    OFF3    1469194694
EL PROGRESO -- DOS QUEBRADAS    ON3 1469146950
EXITO -- SUBA   ON3 1469214392
EXITO -- SUBA   OFF3    1469199388
MEGACITY ZIPAQUIRA  OFF3    1469194774
MERCURIO    ON3 1469231767
MERCURIO    OFF3    1469198081
METROPOLITANO   ON3 1469228672
METROPOLITANO   OFF3    1469225061
NIZA    OFF3    1469218151
NIZA    ON3 1469214985
PLATINO     ON3 1469228261
PLATINO     OFF3    1469217680
PORTAL DEL PRADO    OFF3    1469147653
TITAN PLAZA OFF3    1469213346
TITAN PLAZA ON3 1469211705

我怎样才能让它只显示更高的值,这样我就不会得到同一个地方的两个值。

【问题讨论】:

    标签: sql sql-server compare


    【解决方案1】:

    您确实应该开始使用 ANSI-92 样式的连接。他们已经存在了 20 多年。那些逗号分隔的表名是一个坏习惯。

    在同一个查询中使用 distinct 和 group by 没有意义。

    您还应该使用别名来使您的查询更加清晰。至于您的实际问题,您可以使用 ROW_NUMBER。这样的事情应该很接近了。

    with MySortedResults as
    (
        Select 
            o.Name
            , os.Code
            , os.TimeIn as tiempo
            , ROW_NUMBER() over (partition by o.Name order by os.TimeIn desc) as RowNum
        from dbo.[Object] o
        join dbo.[ObjectSignal_2016_07_22] os on o.Name = os.ObjectName
        where 
            o.IdClient = '6C74F97C-7253-415D-96B1-4B902D8334D7'
            and os.Code IN ('ON3', 'OFF3', 'E401', 'R401')    
    )   
    
    select sr.Name
        , sr.Code
        , sr.tiempo
    from MySortedResults sr
    where sr.RowNum = 1
    order by sr.Name
    

    【讨论】:

    • 很抱歉,当我在这部分将您的代码传递给 sql 时,他向我展示了问题:
    • sr.Name sr.Code sr.tiempo
    • 这是男士的日志信息。 4104, Nivel 16, Estado 1, Línea 15 El identificador formado por varias partes "sr.Name" no se pudo enlazar。男士。 4104, Nivel 16, Estado 1, Línea 16 El identificador formado por varias partes "sr.Code" no se pudo enlazar。男士。 4104, Nivel 16, Estado 1, Línea 17 El identificador formado por varias partes "sr.tiempo" no se pudo enlazar。男士。 4104, Nivel 16, Estado 1, Línea 19 El identificador formado por varias partes "sr.Name" no se pudo enlazar。
    • 好的,我可以运行它,但我认为没有正确解释我的自我。我只想获取每个 NAME 显示的两者之间时间更长的值。
    • 例如 AV CHILE PORCIUNCULA OFF3 1469195866 AV CHILE PORCIUNCULA ON3 1469147891] 我只想获得 AV CHILE PORCIUNCULA OFF3 1469195866。原因是获得此 sucursal 的最后数据
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多