복붙노트

[SQL] 행이 최대 날짜가 테이블에서 선택 정보

SQL

행이 최대 날짜가 테이블에서 선택 정보

내 표는 다음과 같은 :

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 서버 2005

해결법

  1. ==============================

    1.

    SELECT group,MAX(date) as max_date
    FROM table
    WHERE checks>0
    GROUP BY group
    

    작품은 다시 다른 열을 얻을 수있는 데이터에 date..join 최대를 얻을 수 있음 :

    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. ==============================

    2.이 같은 창 MAX ()를 사용할 수 있습니다 :

    이 같은 창 MAX ()를 사용할 수 있습니다 :

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

    다른 데이터와 함께 그룹 당 최대 날짜를 얻을 수 있습니다 :

    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
    

    파생 테이블로 위의 출력을 사용하면 다음 날짜 MAX_DATE 일치하는 경우에만 행을 얻을 수 있습니다 :

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

    원하는 결과를 얻을 수 있습니다.

    기본적으로,이 열두 번째의 제안 @ 비슷하지만 조인하여보다 효율적으로 할 수있다 피할 수 있습니다.

    당신은 SQL 바이올린의 방법을 시도 할 수 있습니다.

  3. ==============================

    3.에서를 사용하면 성능에 영향을 줄 수 있습니다. 두 개의 하위 쿼리에 가입하면 동일한 성능에 영향을주지 않습니다와 같이 수행 할 수 있습니다 :

    에서를 사용하면 성능에 영향을 줄 수 있습니다. 두 개의 하위 쿼리에 가입하면 동일한 성능에 영향을주지 않습니다와 같이 수행 할 수 있습니다 :

    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.

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

    작동합니다.

  5. ==============================

    5.

    SELECT group, date, checks
      FROM table 
      WHERE checks > 0
      GROUP BY group HAVING date = max(date) 
    

    작동합니다.

  6. from https://stackoverflow.com/questions/19432913/select-info-from-table-where-row-has-max-date by cc-by-sa and MIT license