Development Tip

SQL : 고유 한 행을 선택하면서 한 필드의 최소값으로 그룹화

yourdevel 2020. 12. 30. 19:42
반응형

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 항목이 고유하다고 가정하지만 내 데이터에서는 그렇지 않습니다. 하위 쿼리와 두 가지 조건이있는 내부 조인을 사용하면 일부 ID에 대해 중복 행을 얻을 수 있지만 원하지 않습니다.

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

같은 건 어때

SELECT mt.*,     
FROM MyTable mt INNER JOIN
    (
        SELECT ID, MIN(Record_Date) MinDate
        FROM MyTable
        GROUP BY ID
    ) t ON mt.ID = t.ID AND mt.Record_Date = t.MinDate

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


에서 이렇게하면 예상 한 결과를 얻을 수 있습니다 .

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

이것이 당신을 위해 작동합니까?


각 범주에서 가장 저렴한 제품을 얻으려면 다음과 같이 상관 된 하위 쿼리에서 MIN () 함수를 사용합니다.

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

외부 쿼리는 제품 테이블의 모든 행을 스캔하고 상관 하위 쿼리에서 반환 된 각 범주의 최저 가격과 일치하는 단가가있는 제품을 반환합니다.


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

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

여기에 다른 답변 중 일부에 추가하고 싶습니다. 첫 번째 항목이 필요하지 않지만 두 번째 숫자를 말하면 하위 쿼리에서 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가 동일한 값을 갖는 경우 도움이 될 수있는 하위 쿼리의 여러 열을 정렬 할 수 있습니다. 필요한 경우 쉼표로 구분하여 여러 열을 분할 할 수도 있습니다.


이것은 오래된 질문이지만 누군가에게 유용 할 수 있습니다. 내 경우에는 큰 쿼리가 있고 결과에 min ()을 사용해야하기 때문에 하위 쿼리를 사용할 수 없습니다. 하위 쿼리를 사용하면 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

기본적으로 결과를 정렬 한 다음 각 그룹의 첫 번째 레코드 만 가져 오기 위해 변수를 입력했습니다.


아래 쿼리는 각 작업 주문의 첫 번째 날짜를 사용합니다 (모든 상태 변경 사항을 보여주는 표에서).

SELECT
    WORKORDERNUM,
    MIN(DATE)
FROM
    WORKORDERS
WHERE
    DATE >= to_date('2015-01-01','YYYY-MM-DD')
GROUP BY
    WORKORDERNUM

참조 URL : https://stackoverflow.com/questions/18725168/sql-group-by-minimum-value-in-one-field-while-selecting-distinct-rows

반응형