programing

MySQL: DISTINCT / UNIQUENT를 선택하지만 모든 열을 반환하시겠습니까?

muds 2023. 5. 21. 12:01
반응형

MySQL: DISTINCT / UNIQUENT를 선택하지만 모든 열을 반환하시겠습니까?

SELECT DISTINCT field1, field2, field3, ......
FROM table;

다음 SQL 문을 수행하려고 하는데 모든 열을 반환했으면 합니다.
이것이 가능합니까?

이와 같은 것:

SELECT DISTINCT field1, * 
FROM table;

다음을 기준으로 그룹을 찾습니다.

select *
from table
group by field1

다음과 같이 구별되는 on 문으로 작성될 수 있습니다.

select distinct on field1 *
from table

그러나 대부분의 플랫폼에서는 다른 열의 동작이 지정되지 않았기 때문에 위의 두 가지 모두 작동하지 않습니다.(MySQL의 첫 번째 기능은 MySQL에서 작동합니다.)

고유한 필드를 가져와 매번 하나의 임의 행을 선택할 수 있습니다.

일부 플랫폼(예: Postgre)SQL, Oracle, T-SQL) 창 함수를 사용하여 직접 수행할 수 있습니다.

select *
from (
   select *,
          row_number() over (partition by field1 order by field2) as row_number
   from table
   ) as rows
where row_number = 1

다른 경우(MySQL, SQLite)에는 전체 테이블을 자신과 함께 결합하는 하위 쿼리(: 권장되지 않음)를 작성해야 합니다.

질문의 구문을 보면 특정 필드와 각 필드에 대해 고유한 값을 선택하여 동일한 행에 있는 다른 모든 열 값을 나열하려는 것으로 알고 있습니다.는 "DBMS"와 "DBMS" 모두 할 수 .DISTINCT도 아니다GROUP BY결과가 결정되지 않았기 때문입니다.

: 당신의 게생각요: 만당신이세하약.field1번 하는 경우, 두어번발이, 값떤상의 은 무엇입니까?field2 사용자가 표시됩니다.field1이지만 두 을 가진 field2그 두 줄에).

집계 함수를하고 그러표나집계함다사다사있수니습용할음을로고으명하용대수적시를해필모에드든할시▁a▁(▁functions▁you표▁however▁aggregate▁using다▁can▁that있▁(▁use니그습expl수러집사▁field))를 사용할 수 있습니다.GROUP BYDISTINCT:

SELECT field1, MAX(field2), COUNT(field3), SUM(field4), ....
FROM table GROUP BY field1

제가 당신의 문제를 제대로 이해했다면, 방금 전의 문제와 비슷합니다.DISTINCT의 유용성을 모든 데이터에 적용하지 않고 지정된 필드로 제한할 수 있습니다.

집계 함수를 사용하지 않고 GROUP BY를 사용하는 경우, 어느 필드를 기준으로 GROUP BY를 사용해도 고유한 필드가 됩니다.

쿼리를 수행하는 경우:

SELECT * from table GROUP BY field1;

필드1의 단일 인스턴스를 기준으로 모든 결과가 표시됩니다.

예를 들어 이름, 주소 및 도시가 포함된 테이블이 있는 경우한 명의 사용자가 여러 개의 주소를 기록하지만, 해당 사용자의 단일 주소를 원할 경우 다음과 같이 쿼리할 수 있습니다.

SELECT * FROM persons GROUP BY name;

결과적으로 해당 이름의 인스턴스 하나만 해당 주소와 함께 나타나고 다른 인스턴스 하나는 결과 테이블에서 생략됩니다.주의: 필드에 firstName, lastName과 같은 원자 값이 있을 경우 둘 다로 그룹화합니다.

SELECT * FROM persons GROUP BY lastName, firstName;

왜냐하면 두 사람이 같은 성을 가지고 있고 당신이 성으로만 그룹을 묶는다면, 그 사람들 중 한 명이 결과에서 누락될 것이기 때문입니다.당신은 그것들을 고려할 필요가 있습니다.이게 도움이 되길 바랍니다.

정말 좋은 질문입니다.저는 이미 여기서 유용한 답변을 읽었지만, 아마도 더 정확한 설명을 추가할 수 있을 것입니다.

GROUP BY 문으로 쿼리 결과 수를 줄이는 것은 추가 정보를 쿼리하지 않는 한 쉽습니다.다음 표 '위치'를 얻었다고 가정하겠습니다.

--country-- --city--
 France      Lyon
 Poland      Krakow
 France      Paris
 France      Marseille
 Italy       Milano

이제 질문입니다.

SELECT country FROM locations
GROUP BY country

결과:

--country--
 France
 Poland
 Italy

그러나 다음 쿼리는

SELECT country, city FROM locations
GROUP BY country

...MS SQL에 오류가 발생합니다. 컴퓨터가 "프랑스" 오른쪽 필드에서 읽고 싶은 프랑스 도시 "리옹", "파리" 또는 "마르세유" 중 어느 것을 알 수 있었습니까?

두 번째 쿼리를 수정하려면 이 정보를 추가해야 합니다.이렇게 하는 한 가지 방법은 MAX() 또는 MIN() 기능을 사용하여 모든 후보 중 가장 큰 값 또는 가장 작은 값을 선택하는 것입니다. MAX() 및 MIN()은 숫자 값에 적용될 뿐만 아니라 문자열 값의 알파벳 순서도 비교할 수 있습니다.

SELECT country, MAX(city) FROM locations
GROUP BY country

결과:

--country-- --city--
 France      Paris
 Poland      Krakow
 Italy       Milano

또는:

SELECT country, MIN(city) FROM locations
GROUP BY country

결과:

--country-- --city--
 France      Lyon
 Poland      Krakow
 Italy       Milano

이러한 함수는 알파벳 순서(또는 숫자 순서)의 양쪽 끝에서 값을 선택하는 데 문제가 없는 한 좋은 솔루션입니다.하지만 이것이 사실이 아니라면요?예를 들어 'M'자로 시작하는 특정 특성을 가진 값이 필요하다고 가정합니다. 이제 상황이 복잡해집니다.

제가 지금까지 찾을 수 있는 유일한 해결책은 당신의 전체 쿼리를 하위 쿼리에 넣고 그 밖에 추가 열을 손으로 구성하는 것입니다.

SELECT
     countrylist.*,
     (SELECT TOP 1 city
     FROM locations
     WHERE
          country = countrylist.country
          AND city like 'M%'
     )
FROM
(SELECT country FROM locations
GROUP BY country) countrylist

결과:

--country-- --city--
 France      Marseille
 Poland      NULL
 Italy       Milano
SELECT  c2.field1 ,
        field2
FROM    (SELECT DISTINCT
                field1
         FROM   dbo.TABLE AS C
        ) AS c1
        JOIN dbo.TABLE AS c2 ON c1.field1 = c2.field1

훌륭한 질문 @aryaxt -- 당신은 그것이 훌륭한 질문이었다고 말할 수 있습니다. 왜냐하면 당신은 5년 전에 그것을 물었고 저는 오늘 답을 찾으려다가 우연히 그것을 발견했기 때문입니다!

저는 이것을 포함하기 위해 승인된 답변을 편집하려고 했지만, 제 편집이 성공하지 못할 경우:

테이블이 그리 크지 않고 기본 키가 자동 증분 정수라고 가정하면 다음과 같은 작업을 수행할 수 있습니다.

SELECT 
  table.*
FROM table
--be able to take out dupes later
LEFT JOIN (
  SELECT field, MAX(id) as id
  FROM table
  GROUP BY field
) as noDupes on noDupes.id = table.id
WHERE
  //this will result in only the last instance being seen
  noDupes.id is not NULL

해라

SELECT table.* FROM table 
WHERE otherField = 'otherValue'
GROUP BY table.fieldWantedToBeDistinct
limit x

당신은 그것을 할 수 있습니다.WITH

예:

WITH c AS (SELECT DISTINCT a, b, c FROM tableName)
SELECT * FROM tableName r, c WHERE c.rowid=r.rowid AND c.a=r.a AND c.b=r.b AND c.c=r.c

한다음서에행선수있다습에서 할 수 .WITH절 쿼리.

SQL Server의 경우 dense_rank 및 추가 창 기능을 사용하여 지정된 열의 값이 중복된 모든 행과 열을 가져올 수 있습니다.여기 예가 있습니다...

with t as (
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r1' union all
    select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r2' union all
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r3' union all
    select col1 = 'a', col2 = 'b', col3 = 'c', other = 'r4' union all
    select col1 = 'c', col2 = 'b', col3 = 'a', other = 'r5' union all
    select col1 = 'a', col2 = 'a', col3 = 'a', other = 'r6'
), tdr as (
    select 
        *, 
        total_dr_rows = count(*) over(partition by dr)
    from (
        select 
            *, 
            dr = dense_rank() over(order by col1, col2, col3),
            dr_rn = row_number() over(partition by col1, col2, col3 order by other)
        from 
            t
    ) x
)

select * from tdr where total_dr_rows > 1

이것은 col1, col2 및 col3의 각 고유한 조합에 대한 행 수를 계산하는 것입니다.

select min(table.id), table.column1
from table 
group by table.column1
SELECT *
FROM tblname
GROUP BY duplicate_values
ORDER BY ex.VISITED_ON DESC
LIMIT 0 , 30

ORDER BY여기에 예시를 넣었습니다. 여기에 ID 필드를 추가할 수도 있습니다.

다른 곳에서 찾았지만 다음과 같은 간단한 솔루션을 사용할 수 있습니다.

 WITH cte AS /* Declaring a new table named 'cte' to be a clone of your table */
 (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY val1 DESC) AS rn
 FROM MyTable /* Selecting only unique values based on the "id" field */
 )
 SELECT * /* Here you can specify several columns to retrieve */
 FROM cte
 WHERE rn = 1

이런 방식으로 쿼리 하나로 고유한 열 2개를 가져올 수 있습니다. col1, col2는 '{path}' 그룹에서 col1, col2를 선택하십시오. 필요한 경우 열을 늘릴 수 있습니다.

쿼리가 다음과 같이 나타날 수 있는 중복 항목을 확인할 필드에 GROUP BY

SELECT field1, field2, field3, ......   FROM table GROUP BY field1

필드 1은 중복 레코드를 제외하도록 선택됩니다.

또는 다음과 같은 질문을 할 수 있습니다.

SELECT *  FROM table GROUP BY field1

필드1의 중복 레코드는 SELECT에서 제외됩니다.

GROUP BY 절에 모든 필드를 포함하면 됩니다.

내부 쿼리로 수행할 수 있습니다.

$query = "SELECT * 
            FROM (SELECT field
                FROM table
                ORDER BY id DESC) as rows               
            GROUP BY field";
SELECT * from table where field in (SELECT distinct field from table)

표 1에서 고유 필드 1, 필드 2, 필드 3을 선택하면 세 열의 값이 모두 표에서 고유한 경우 작동합니다.

예를 들어 이름에 대해 동일한 값이 여러 개 있지만 선택한 열의 성과 기타 정보가 다를 경우 레코드가 결과 집합에 포함됩니다.

를 사용하는 것이 좋습니다.

SELECT  * from table where field1 in 
(
  select distinct field1 from table
)

이렇게 하면 여러 행에 걸쳐 필드 1의 값이 같을 경우 모든 레코드가 반환됩니다.

언급URL : https://stackoverflow.com/questions/6127338/mysql-select-distinct-unique-but-return-all-columns

반응형