代码之家  ›  专栏  ›  技术社区  ›  kqlambert

从表中选择行具有最大日期的信息

  •  87
  • kqlambert  · 技术社区  · 11 年前

    我的桌子看起来像这样:

    group    date      cash  checks
      1    1/1/2013     0      0
      2    1/1/2013     0      800
      1    1/3/2013     0      700
      3    1/1/2013     0      600
      1    1/2/2013     0      400
      3    1/5/2013     0      200
    

    --不需要现金,只需证明表格中有更多信息

    我想得到每个唯一的组,其中日期是最大值,检查值大于0。所以回报看起来是这样的:

    group    date     checks
      2    1/1/2013    800
      1    1/3/2013    700
      3    1/5/2013    200
    

    尝试的代码:

    SELECT group,MAX(date),checks
        FROM table
        WHERE checks>0
        GROUP BY group
        ORDER BY group DESC
    

    但问题是,它给了我所有的日期和检查,而不仅仅是最大日期行。

    使用ms-sql-server2005

    4 回复  |  直到 11 年前
        1
  •  179
  •   Twelfth    7 年前
    SELECT group,MAX(date) as max_date
    FROM table
    WHERE checks>0
    GROUP BY group
    

    这样可以获得最长日期。。将其连接回您的数据以获取其他列:

    Select group,max_date,checks
    from table t
    inner join 
    (SELECT group,MAX(date) as max_date
    FROM table
    WHERE checks>0
    GROUP BY group)a
    on a.group = t.group and a.max_date = date
    

    内部联接起到过滤器的作用,只获取最大记录。

    仅供参考,您的列名很糟糕,不要使用保留字作为列(组、日期、表)。

        2
  •  52
  •   Community CDub    8 年前

    您可以使用 window MAX()如下所示:

    SELECT
      *, 
      max_date = MAX(date) OVER (PARTITION BY group)
    FROM table
    

    获取每个的最大日期 group 以及其他数据:

    group  date      cash  checks  max_date
    -----  --------  ----  ------  --------
    1      1/1/2013  0     0       1/3/2013
    2      1/1/2013  0     800     1/1/2013
    1      1/3/2013  0     700     1/3/2013
    3      1/1/2013  0     600     1/5/2013
    1      1/2/2013  0     400     1/3/2013
    3      1/5/2013  0     200     1/5/2013
    

    使用上面的输出作为派生表,然后可以只获得其中的行 date 比赛 max_date :

    SELECT
      group,
      date,
      checks
    FROM (
      SELECT
        *, 
        max_date = MAX(date) OVER (PARTITION BY group)
      FROM table
    ) AS s
    WHERE date = max_date
    ;

    以获得期望的结果。

    基本上,这与 @Twelfth's suggestion 但是避免了连接并且因此可以更有效。

    你可以试试这个方法 at SQL Fiddle .

        3
  •  5
  •   ahsteele tungi52    5 年前

    使用 in 可能会对性能产生影响。连接两个子查询不会产生相同的性能影响,可以这样完成:

    SELECT *
      FROM (SELECT msisdn
                  ,callid
                  ,Change_color
                  ,play_file_name
                  ,date_played
              FROM insert_log
             WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
            ORDER BY callid ASC) t1
           JOIN (SELECT MAX(date_played) AS date_played
                   FROM insert_log GROUP BY callid) t2
             ON t1.date_played = t2.date_played
    
        4
  •  4
  •   aha    6 年前
    SELECT distinct
      group, 
      max_date = MAX(date) OVER (PARTITION BY group), checks
    FROM table
    

    应该有效。