SELECT DISTINCT field1, field2, field3, ...... FROM table
Я пытаюсь выполнить следующий sql-оператор, но я хочу, чтобы он возвращал все столбцы, это возможно? Что-то вроде:
SELECT DISTINCT field1, * from table
SELECT DISTINCT field1, field2, field3, ...... FROM table
Я пытаюсь выполнить следующий sql-оператор, но я хочу, чтобы он возвращал все столбцы, это возможно? Что-то вроде:
SELECT DISTINCT field1, * from table
Вы ищете группу по:
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) вам нужно написать подзапросы, которые заставят вас присоединиться ко всей таблице с самим собой (пример), поэтому не рекомендуется.
Из выражения вашего вопроса я понимаю, что вы хотите выбрать различные значения для данного поля и для каждого такого значения иметь все остальные значения столбца в одной и той же строке. Большинство СУБД не разрешают это ни с DISTINCT
, ни GROUP BY
, потому что результат не определен.
Подумайте об этом так: если ваш field1
встречается более одного раза, какое значение field2
будет указано (учитывая, что у вас есть одно и то же значение для field1
в две строки, но два разных значения field2
в этих двух строках).
Однако вы можете использовать агрегатные функции (явно для каждого поля, которое вы хотите отобразить) и используя GROUP BY
вместо DISTINCT
:
SELECT field1, MAX(field2), COUNT(field3), SUM(field4), .... FROM table GROUP BY field1
Если я правильно понял вашу проблему, это похоже на то, что я только что имел. Вы хотите ограничить удобство использования 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, один из этих лиц будет исключен из результатов. Вы должны учитывать это. Надеюсь это поможет.
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
Это действительно хороший вопрос. Я уже прочитал некоторые полезные ответы, но, вероятно, я могу добавить более точное объяснение.
Уменьшение количества результатов запроса с помощью оператора 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
Отличный вопрос @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 и дополнительных окон, чтобы получить все столбцы строк 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.
SELECT *
FROM tblname
GROUP BY duplicate_values
ORDER BY ex.VISITED_ON DESC
LIMIT 0 , 30
in ORDER BY
Я просто привел пример здесь, вы также можете добавить поле ID в этом
select min(table.id), table.column1
from table
group by table.column1
Добавить 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)
SELECT DISTINCT FIELD1, FIELD2, FIELD3 FROM TABLE1 работает, если значения всех трех столбцов уникальны в таблице.
Если, например, у вас есть несколько одинаковых значений для имени, но имя и другая информация в выбранных столбцах различны, запись будет включена в результирующий набор.
Я бы предложил использовать
SELECT * from table where field1 in
(
select distinct field1 from table
)
таким образом, если у вас есть одно и то же значение в field1 в нескольких строках, будут возвращены все записи.