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가있는 경우입니다.
mysql 에서 이렇게하면 예상 한 결과를 얻을 수 있습니다 .
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
'Development Tip' 카테고리의 다른 글
Python으로 YAML 파일을 읽으면 yaml.composer.ComposerError : 스트림에 단일 문서가 필요합니다. (0) | 2020.12.30 |
---|---|
누름 (0) | 2020.12.30 |
GoDaddy SSL 인증서가 Java에서 작동하지 않음 (0) | 2020.12.30 |
C # 관리자 권한으로 실행되는지 확인 (0) | 2020.12.29 |
JS 힌트-루프 내에서 함수를 만들지 마십시오. (0) | 2020.12.29 |