programing

가장 많이 발생한 값을 포함하는 모든 행 반환

linuxpc 2023. 7. 20. 21:45
반응형

가장 많이 발생한 값을 포함하는 모든 행 반환

이 질문은 가장 많이 발생하는 값을 반환하라는 일반적인 질문과 유사하게 보일 수 있습니다.그러나 가장 자주 발생하는 값을 포함하는 모든 행을 나열해야 합니다.

이 예에서는 zipCode가 3번 표시됩니다(다른 우편 번호 중 가장 많이 표시됨저는 해당 우편번호가 조회 시 가장 많이 발생하는 우편번호를 알 필요 없이 모든 우편번호를 나열하고 싶습니다.

내 질문:

SELECT *, COUNT(zipCode) AS NumOccurrences
FROM customers
GROUP BY zipCode
ORDER BY NumOccurrences DESC
LIMIT 1

반환:

enter image description here

반환할 내용:

enter image description here

이 쿼리를 분명히 사용하지 않고는 다음 작업을 수행할 수 없습니다.

SELECT *
FROM customers
WHERE zipCode = 10001

저는 그 우편번호의 첫 번째 인스턴스뿐만 아니라 세 번의 발생을 각각 반환하고 싶습니다.지금은 어떤 우편 번호가 조회 시 가장 많이 발생하는지 알 수 없기 때문에 위의 조회를 사용할 필요가 없습니다.

효과가 있을지도 모르는 @eshirvana로 대체합니다.다시 말하지만, 에서는 여러 개의 동등한 최대 수(여러 개의 우편 번호가 동일한 최대 횟수)의 가능성을 제대로 고려하지 않습니다.

SELECT *
FROM customers
WHERE zipCode = (
    SELECT zipCode
    FROM customers
    GROUP BY zipCode
    ORDER BY count(zipCode) DESC
    LIMIT 1
);

이것이 당신이 해야 할 일입니다, 만약 당신이 넥타이를 가지고 있다면, 그것은 무작위로 첫 번째 우편번호 세트를 선택합니다.

select *
FROM customers
WHERE zipCode IN (
              select zipCode 
              from customers 
              group by zipCode 
              order by count(*) desc
              limit 1
             )

또는

select *
from ( 
      select * , count(*) over (partition by zipcode) rn
     )
order by rn desc
limit 1
select 
 customers.id
 , customers.city
 , customers.state
 , customers.zipCode
 , customers.firstName
 , customers.lastName
 , customers.streetAddress
from customers
join (
  select 
    x.zipAddress
    , rank() over( order by x.frequency desc ) -- the highest number will get rank #1
      as zipRank
  from (
    select c.zipAddress, count(*) as frequency 
    from customers c 
    group by c.zipAddress 
  ) x
) zip
on zip.zipAddress = customers.zipAddress
  and zip.zipRank = 1

참고: 여러 개의 다른 ZIP 코드에 동일한 카운트가 있는 경우customers표, 그들 모두가 1위를 차지할 것이고, 결과적으로, 그 ZIP 코드를 포함하는 모든 주소가 나열될 것입니다.이것은 Oracle에서 작동합니다.근처에 MySQL 인스턴스가 없지만 버전 8 이상이면 작동할 것입니다.

창 기능을 사용하여 모든 우편 번호를 세 번 입력하려면 다음과 같이 하십시오.

SELECT c.*
FROM (SELECT c.*,
             COUNT(zipCode) OVER (PARTITION BY zipCode)AS NumOccurrences
      FROM customers c
     ) c
WHERE NumOccurrences = 3
ORDER BY zipCode;

"3"을 지정하지 않고 최대값을 지정하려면 다음을 사용합니다.RANK()또한:

SELECT c.*
FROM (SELECT c.*,
             RANK() OVER (ORDER BY NumOccurrences DESC) as seqnum
      FROM (SELECT c.*,
                   COUNT(zipCode) OVER (PARTITION BY zipCode)AS NumOccurrences
            FROM customers c
           ) c
     ) c
WHERE seqnum = 1
ORDER BY zipCode;

언급URL : https://stackoverflow.com/questions/66404248/return-every-row-that-contains-the-most-occurring-value

반응형