【问题标题】:select conditional data in groups分组选择条件数据
【发布时间】:2012-01-10 21:24:48
【问题描述】:

我有一个表,其中包含借给用户的机器列表。每次将机器退回我们取出时都会输入一个条目。我使用以下语句按用户、机器#、日期和操作返回列表

SELECT Name, Asset#, Date, InOut
FROM Table
ORDER BY Asset#, date asc

返回

Name      Asset#       Date        InOut
Jimmy     BER210    2009-05-08      out
Jimmy     BER210    2009-06-08      in
Jimmy     BER210    2009-07-08      out
Sam       BER220    2009-05-08      out
Sam       BER220    2009-06-08      In
Jack      BER230    2009-05-08      out
Jack      BER230    2009-06-08      In
Jack      BER230    2009-07-08      out

我正在寻求帮助修改该查询以仅返回最近的条目,并且仅当该机器当前已出时。

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: sql select greatest-n-per-group


    【解决方案1】:

    您可以使用inner join 过滤掉每台机器上的旧行。获得最新行后,where 可用于选择“出局”的机器。

    select  Name, Asset#, Date, InOut
    from    Table t
    join    (
            select  Asset#
            ,       max(Date) as MaxDate
            from    Table
            group by
                    Asset#
            ) filter
    on      filter.Asset# = t.Asset#
            and filter.MaxDate = t.Date
    where   t.InOut = 'Out'
    

    【讨论】:

    • 赞成正确答案,并纠正其他人的问题
    【解决方案2】:
    select Name, Asset#, Date, InOut
     from Table
       natural join (
        select Asset#, max(Date) as Date
        from Table
        group by Asset#
      )
    where InOut = 'out'
    order by date desc
    

    固定

    【讨论】:

    • InOut = 'out' 不应该在子查询之外吗?
    • 没有。子查询返回最近结帐的资产和日期。完整查询将其与主表连接起来以获取整个记录。但是,如果在特定日期有多个结帐,这可能会表现得很奇怪。我需要根据真实数据检查结果,你可能是对的:)
    • OP 说“并且仅当那台机器当前不在时”。当前形式的这个答案将显示一台机器在其最新的“out”记录之后有一个“in”记录。
    • 你是对的。我的查询显示每台机器的最新结帐。只有在结帐时才不是最新记录。固定。
    【解决方案3】:

    在 SQLServer 中

    SELECT TOP 1 Name, Asset#, Date, InOut
    FROM Table
    WHERE InOut = 'out'
    ORDER BY Date DESC
    

    在 MySQL 中

    SELECT Name, Asset#, Date, InOut
    FROM Table
    WHERE InOut = 'out'
    ORDER BY Date DESC
    LIMIT 1
    

    【讨论】:

    • 返回机器最近一次出故障的时间?不要以为这就是 OP 所追求的
    【解决方案4】:

    选择名称、资产#、日期、输入输出

    FROM Table WHERE InOut ='out' ORDER BY date desc

    【讨论】:

      【解决方案5】:
      SELECT Name, Asset#, Date, InOut
      FROM Table o
      WHERE Date = (select max(Date) from 
                    Table i 
                    where i.Asset# = o.Asset#
                   )
      )
      where o.in_out = 'out'
      ORDER BY Asset#, date asc
      

      编辑根据评论将i.in_out更改为o.in_out

      【讨论】:

      • 应该可以,如果你把where i.in_out改成where o.in_out
      • 感谢您指出我的错误。你是对的。我已经编辑了答案。
      猜你喜欢
      • 2017-10-15
      • 2018-05-18
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      相关资源
      最近更新 更多