Подтвердить что ты не робот

SQL/mysql - выберите отдельный /UNIQUE, но верните все столбцы?

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

Я пытаюсь выполнить следующий sql-оператор, но я хочу, чтобы он возвращал все столбцы, это возможно? Что-то вроде:

SELECT DISTINCT field1, * from table
4b9b3361

Ответ 1

Вы ищете группу по:

select *
from table
group by field1

который иногда может быть записан с помощью выраженного выражения:

select distinct on field1 *
from table

Однако на большинстве платформ ни одно из указанных выше не будет работать, потому что поведение в других столбцах не указано. (Первый работает в MySQL, если это то, что вы используете.)

Вы можете получать отдельные поля и каждый раз выбирать одну произвольную строку.

На некоторых платформах (например, PostgreSQL, 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) вам нужно написать подзапросы, которые заставят вас присоединиться ко всей таблице с самим собой (пример), поэтому не рекомендуется.

Ответ 2

Из выражения вашего вопроса я понимаю, что вы хотите выбрать различные значения для данного поля и для каждого такого значения иметь все остальные значения столбца в одной и той же строке. Большинство СУБД не разрешают это ни с DISTINCT, ни GROUP BY, потому что результат не определен.

Подумайте об этом так: если ваш field1 встречается более одного раза, какое значение field2 будет указано (учитывая, что у вас есть одно и то же значение для field1 в две строки, но два разных значения field2 в этих двух строках).

Однако вы можете использовать агрегатные функции (явно для каждого поля, которое вы хотите отобразить) и используя GROUP BY вместо DISTINCT:

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

Ответ 3

Если я правильно понял вашу проблему, это похоже на то, что я только что имел. Вы хотите ограничить удобство использования DISTINCT указанным полем, а не применять его ко всем данным.

Если вы используете GROUP BY без агрегатной функции, которая когда-либо выставляет вас, GROUP BY будет вашим DISTINCT.

Если вы сделаете свой запрос:

SELECT * from table GROUP BY field1;

Он отобразит все ваши результаты на основе одного экземпляра поля1.

Например, если у вас есть таблица с именем, адресом и городом. У одного человека есть несколько адресов, но вам нужен только один адрес для человека, вы можете запросить следующее:

SELECT * FROM persons GROUP BY name;

В результате будет отображаться только один экземпляр этого имени с его адресом, а другой будет исключен из результирующей таблицы. Предостережение: если ваши поля имеют атомные значения, такие как firstName, lastName, которые вы хотите сгруппировать с помощью обоих.

SELECT * FROM persons GROUP BY lastName, firstName;

потому что, если у двух людей есть одна и та же фамилия, и вы только группируете lastName, один из этих лиц будет исключен из результатов. Вы должны учитывать это. Надеюсь это поможет.

Ответ 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

Это действительно хороший вопрос. Я уже прочитал некоторые полезные ответы, но, вероятно, я могу добавить более точное объяснение.

Уменьшение количества результатов запроса с помощью оператора 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

Эти функции являются хорошим решением, если вы в порядке с выбором своего значения из обоих концов алфавитного (или числового) порядка. Но что, если это не так? Предположим, что вам нужно значение с определенной характеристикой, например. начиная с буквы "М". Теперь все усложняется.

Единственное решение, которое я смог найти, заключается в том, чтобы поместить весь ваш запрос в подзапрос и построить дополнительный столбец за его пределами руками:

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

Отличный вопрос @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

Ответ 7

Пытаться

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

Ответ 8

Вы можете сделать это с помощью предложения 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

Для SQL Server вы можете использовать функции dense_rank и дополнительных окон, чтобы получить все столбцы строк AND с дублирующимися значениями в указанных столбцах. Вот пример...

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

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

in ORDER BY Я просто привел пример здесь, вы также можете добавить поле ID в этом

Ответ 11

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

Ответ 12

Добавить GROUP BY в поле, которое вы хотите проверить на наличие дубликатов ваш запрос может выглядеть как

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

поле1 будет проверено, чтобы исключить дубликаты записей

или вы можете запросить как

SELECT *  FROM table GROUP BY field1

повторяющиеся записи поля1 исключаются из SELECT

Ответ 13

Просто включите все свои поля в предложение GROUP BY.

Ответ 14

Это можно сделать с помощью внутреннего запроса

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

Ответ 15

SELECT * from table where field in (SELECT distinct field from table)

Ответ 16

SELECT DISTINCT FIELD1, FIELD2, FIELD3 FROM TABLE1 работает, если значения всех трех столбцов уникальны в таблице.

Если, например, у вас есть несколько одинаковых значений для имени, но имя и другая информация в выбранных столбцах различны, запись будет включена в результирующий набор.

Ответ 17

Я бы предложил использовать

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

таким образом, если у вас есть одно и то же значение в field1 в нескольких строках, будут возвращены все записи.