복붙노트

[SQL] SQL / MySQL은 - 별개의 / UNIQUE를 선택하지만, 모든 열을 반환?

SQL

SQL / MySQL은 - 별개의 / UNIQUE를 선택하지만, 모든 열을 반환?

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

나는 다음과 같은 SQL 문을 수행하려고하지만 난이 가능한 모든 열을 반환하려면? 뭔가 같은 :

SELECT DISTINCT field1, * from table

해결법

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

    1.당신은 그룹별로 찾고 :

    당신은 그룹별로 찾고 :

    select *
    from table
    group by field1
    

    가끔 문에 별개로 기록 될 수있다 :

    select distinct on field1 *
    from table
    

    대부분의 플랫폼에서, 그러나 어느 쪽도 위의 의지 작업의 다른 컬럼의 동작은 지정 없기 때문입니다. (즉, 만약 MySQL의 첫 번째 작품, 당신은 무엇을 사용하고 있습니다.)

    당신은 별개의 필드를 가져오고 하나의 임의의 행마다 따기에 충실 할 수있다.

    일부 플랫폼 (예를 들어, PostgreSQL을, 오라클, 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는)에, 당신은 당신이 그렇게하지 않는 것이 좋습니다 자체 (예)로 전체 테이블을 조인 할 것이다 쓰기 서브 쿼리해야합니다.

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

    2.질문의 말씨에서, 나는 당신이 나와 같은 행에있는 다른 모든 열 값을 가지고 주어진 필드에 대한 각각의 같은 값에 대한 고유 한 값을 선택합니다 이해합니다. 결과가 결정되지 않기 때문에 대부분의 DBMS는,도 DISTINCT 나 GROUP BY 이것을 허용하지 않습니다.

    질문의 말씨에서, 나는 당신이 나와 같은 행에있는 다른 모든 열 값을 가지고 주어진 필드에 대한 각각의 같은 값에 대한 고유 한 값을 선택합니다 이해합니다. 결과가 결정되지 않기 때문에 대부분의 DBMS는,도 DISTINCT 나 GROUP BY 이것을 허용하지 않습니다.

    이런 식으로 생각 : 당신의 필드 1 번 이상 발생하는 경우 표시됩니다 FIELD2의 어떤 값을 (당신이 두 행하지만 두 행에 FIELD2의 두 가지 값 필드 1에 대해 동일한 값을 가지고 주어진).

    당신은 그러나 및 DISTINCT 대신 GROUP BY를 사용 (모든 당신이 표시하려는 필드에 대해 명시 적으로) 집계 함수를 사용할 수 있습니다 :

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

    3.내가 제대로 문제를 이해하면, 난 그냥했다 것과 유사합니다. 당신은 오히려 모든 데이터에 적용보다, 지정된 필드 수 제한을 DISTINCT의 유용성을 원한다.

    내가 제대로 문제를 이해하면, 난 그냥했다 것과 유사합니다. 당신은 오히려 모든 데이터에 적용보다, 지정된 필드 수 제한을 DISTINCT의 유용성을 원한다.

    혹시 당신을 필드하는 집계 함수없이 GROUP BY를 사용하는 경우 GROUP BY 출원 당신의 DISTINCT 될 것입니다.

    경우에 당신은 당신의 쿼리를 만들 :

    SELECT * from table GROUP BY field1;
    

    이 필드 1의 단일 인스턴스를 기반으로 모든 결과를 표시합니다.

    예를 들어, 이름, 주소, 도시와 테이블이있는 경우. 한 사람이 기록 된 여러 개의 주소를 가지고 있지만, 당신은 다음과 같은 사람을위한 하나의 주소, 당신은 조회 할 수 있습니다합니다 :

    SELECT * FROM persons GROUP BY name;
    

    결과는 그 이름의 하나의 인스턴스 만이 그 주소로 표시되고, 다른 하나가 결과 테이블에서 생략 될 것이라는 것이다. 주의 : fileds는 firstName을 원자 값이있는 경우, 당신은 모두 그룹에 원하는 성.

    SELECT * FROM persons GROUP BY lastName, firstName;
    

    두 사람이 lastName하여 동일한 마지막 이름과 그룹 만이있는 경우, 그 사람의 하나가 결과에서 생략되기 때문. 당신은 고려 사항으로 그 일을 계속해야합니다. 도움이 되었기를 바랍니다.

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

    4.

    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
    
  5. ==============================

    5.그건 정말 좋은 질문입니다. 난 이미 여기에 몇 가지 유용한 답변을 읽고, 그러나 아마 나는 더 정확한 설명을 추가 할 수 있습니다.

    그건 정말 좋은 질문입니다. 난 이미 여기에 몇 가지 유용한 답변을 읽고, 그러나 아마 나는 더 정확한 설명을 추가 할 수 있습니다.

    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
    
  6. ==============================

    6.시험

    시험

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

    7.위대한 질문 @aryaxt - 당신이 5 년 전에 물어 내가 답을 찾기 위해 노력하고 오늘 우연히 때문에 당신이 좋은 질문을했다 말할 수 있습니다!

    위대한 질문 @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
    
  8. ==============================

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

    당신은 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 절 쿼리에서 선택한 행만을 선택할 수 있습니다.

  9. ==============================

    9.SQL Server의 경우는 지정된 컬럼에 중복 값을 가진 모든 행과 열을 얻을 수있는 DENSE_RANK 및 추가 윈도우 기능을 사용할 수 있습니다. 다음은 그 예이다 ..

    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 및 각각 별개의 조합에 대해 행 수를 취하고있다.

  10. ==============================

    10.

    SELECT *
    FROM tblname
    GROUP BY duplicate_values
    ORDER BY ex.VISITED_ON DESC
    LIMIT 0 , 30
    

    난 그냥 여기 예를 뒀다 순서로, 당신은 또한이에 ID 필드를 추가 할 수 있습니다

  11. ==============================

    11.

    select min(table.id), table.column1
    from table 
    group by table.column1
    
  12. ==============================

    12.당신이 중복 검사 할 필드에 GROUP BY 추가 당신의 쿼리처럼 보일 수 있습니다

    당신이 중복 검사 할 필드에 GROUP BY 추가 당신의 쿼리처럼 보일 수 있습니다

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

    필드 1은 중복 레코드를 제외 확인됩니다

    또는 당신은 같은 쿼리 수

    SELECT *  FROM table GROUP BY field1
    

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

  13. ==============================

    13.그냥 GROUP BY 절에 모든 필드를 포함한다.

    그냥 GROUP BY 절에 모든 필드를 포함한다.

  14. ==============================

    14.그것은 내부 쿼리하여 수행 할 수 있습니다

    그것은 내부 쿼리하여 수행 할 수 있습니다

    $query = "SELECT * 
                FROM (SELECT field
                    FROM table
                    ORDER BY id DESC) as rows               
                GROUP BY field";
    
  15. ==============================

    15.

    SELECT * from table where field in (SELECT distinct field from table)
    
  16. ==============================

    16.세 열의 값이 테이블에 고유 한 경우 SELECT DISTINCT FIELD1, FIELD2는 TABLE1 FROM FIELD3 작동합니다.

    세 열의 값이 테이블에 고유 한 경우 SELECT DISTINCT FIELD1, FIELD2는 TABLE1 FROM FIELD3 작동합니다.

    예를 들어, 당신은 이름에 대한 여러 개의 동일한 값을 가지고 있지만, 선택된 컬럼의 마지막 이름과 기타 정보가 다른 경우, 기록은 결과 집합에 포함됩니다.

  17. ==============================

    17.내가 사용하는 것이 좋습니다 것입니다

    내가 사용하는 것이 좋습니다 것입니다

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

    당신이 여러 행에 걸쳐 필드 1의 값이 동일한 경우이 방법은 모든 레코드가 반환됩니다.

  18. from https://stackoverflow.com/questions/6127338/sql-mysql-select-distinct-unique-but-return-all-columns by cc-by-sa and MIT license