복붙노트

[SQL] SQL : 하나 개의 필드에 최소 값을 기준으로 그룹은 별개의 행을 선택하는 동안

SQL

SQL : 하나 개의 필드에 최소 값을 기준으로 그룹은 별개의 행을 선택하는 동안

여기에 내가 할 노력하고있어입니다. 하자 내가이 테이블 t을 가지고 말 :

id | record_date | other_cols
18 | 2011-04-03  | x
18 | 2012-05-19  | y
18 | 2012-08-09  | z
19 | 2009-06-01  | a
19 | 2011-04-03  | b
19 | 2011-10-25  | c
19 | 2012-08-09  | d

각 ID를 위해, 나는 최소 record_date 포함 된 행을 선택합니다. 그래서에게 내가 얻을 것입니다 :

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a

나는이 문제를 본 적이있는 유일한 솔루션은 모든 record_date 항목이 별개 가정,하지만 내 데이터에서이 아니다. 하위 쿼리를 사용하고 내부는 두 개의 조건에 참여하는 것은 나에게 내가 원하는하지 않는 일부 IDS에 대한 중복 행을 줄 것입니다 :

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a

해결법

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

    1.어떻게 같은 약 :

    어떻게 같은 약 :

    SELECT mt.*     
    FROM MyTable mt INNER JOIN
        (
            SELECT id, MIN(record_date) AS MinDate
            FROM MyTable
            GROUP BY id
        ) t ON mt.id = t.id AND mt.record_date = t.MinDate
    

    이 ID 당 최소 날짜를 가져온 다음 그 값을 기준으로 값을 가져옵니다. 동일한 ID에 대한 중복 최소 record_dates가있는 경우 중복있을 것입니다 유일한 시간이다.

  2. ==============================

    2.난 그냥 MySQL의에서이 작업을 수행하여 예상되는 결과를 얻을 수 있습니다 :

    난 그냥 MySQL의에서이 작업을 수행하여 예상되는 결과를 얻을 수 있습니다 :

     SELECT id, min(record_date), other_cols 
      FROM mytable
      GROUP BY id
    

    당신이 작동합니까?

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

    3.다음과 같이 각 카테고리에서 가장 저렴한 제품을 얻으려면, 당신은 상관 하위 쿼리에 MIN () 함수를 사용 :

    다음과 같이 각 카테고리에서 가장 저렴한 제품을 얻으려면, 당신은 상관 하위 쿼리에 MIN () 함수를 사용 :

        SELECT categoryid,
           productid,
           productName,
           unitprice 
        FROM products a WHERE unitprice = (
                    SELECT MIN(unitprice)
                    FROM products b
                    WHERE b.categoryid = a.categoryid)
    

    외부 쿼리는 제품 테이블의 모든 행을 검사하고 단위 가격이 제품이 상관 하위 쿼리에 의해 반환 된 각 범주에서 가장 낮은 가격으로 일치 반환합니다.

  4. ==============================

    4.난 당신이 그의 출발 하위 쿼리 및 기본 당신의 결과에 ROWNUMBER을 사용할 수 있습니다 예를 들어, 두 번째 숫자를 첫 번째 항목을 필요로하지만, 말을하지 않을 경우, 여기에 다른 몇 가지 답변에 추가하고 싶습니다.

    난 당신이 그의 출발 하위 쿼리 및 기본 당신의 결과에 ROWNUMBER을 사용할 수 있습니다 예를 들어, 두 번째 숫자를 첫 번째 항목을 필요로하지만, 말을하지 않을 경우, 여기에 다른 몇 가지 답변에 추가하고 싶습니다.

    SELECT * FROM
    (
        SELECT
            ROW_NUM() OVER (PARTITION BY Id ORDER BY record_date, other_cols) as rownum,
            *
        FROM products P
    ) INNER
    WHERE rownum = 2
    

    이것은 또한 두 record_dates가 동일한 값이있는 경우 도움이 될 수 하위 쿼리에서 여러 열을 주문할 수 있습니다. 쉼표로 구분하여 필요한 경우는 여러 컬럼으로 떨어져 분할 할 수

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

    5.이것은 단순히 그것을 수행합니다

    이것은 단순히 그것을 수행합니다

    select t2.id,t2.record_date,t2.other_cols 
    from (select ROW_NUMBER() over(partition by id order by record_date)as rownum,id,record_date,other_cols from MyTable)t2 
    where t2.rownum = 1
    
  6. ==============================

    6.이 오래된 질문,하지만 사람에게 유용한이 캔 내가 큰 쿼리를 가지고 있기 때문에 내 경우에는 내가 서브 쿼리를 사용하지 않을 수 있으며, 내가 서브 쿼리를 사용하는 경우 DB가 내 큰 쿼리를 다시 실행 필요가 내 결과에 분 ()를 사용하여 필요는 없다. 내가 MySQL을 사용하고 있습니다

    이 오래된 질문,하지만 사람에게 유용한이 캔 내가 큰 쿼리를 가지고 있기 때문에 내 경우에는 내가 서브 쿼리를 사용하지 않을 수 있으며, 내가 서브 쿼리를 사용하는 경우 DB가 내 큰 쿼리를 다시 실행 필요가 내 결과에 분 ()를 사용하여 필요는 없다. 내가 MySQL을 사용하고 있습니다

    select t.* 
        from (select m.*, @g := 0
            from MyTable m --here i have a big query
            order by id, record_date) t
        where (1 = case when @g = 0 or @g <> id then 1 else  0 end )
              and (@g := id) IS NOT NULL
    

    기본적으로 나는 결과를 정렬 한 후 각 그룹의 첫 번째 기록을 얻기 위해 변수를 넣어.

  7. ==============================

    7.쿼리 아래의 (모든 상태 변화를 보여주는 테이블의) 각 작업 주문에 대한 첫 데이트를한다 :

    쿼리 아래의 (모든 상태 변화를 보여주는 테이블의) 각 작업 주문에 대한 첫 데이트를한다 :

    SELECT
        WORKORDERNUM,
        MIN(DATE)
    FROM
        WORKORDERS
    WHERE
        DATE >= to_date('2015-01-01','YYYY-MM-DD')
    GROUP BY
        WORKORDERNUM
    
  8. from https://stackoverflow.com/questions/18725168/sql-group-by-minimum-value-in-one-field-while-selecting-distinct-rows by cc-by-sa and MIT license