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

我试图完成以下SQL语句,但我希望它返回所有列。 这可能吗?

就像这样:

SELECT DISTINCT field1, * 
FROM table;

当前回答

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

在ORDER BY我刚刚把例子放在这里,你也可以在这里添加ID字段

其他回答

SELECT DISTINCT FIELD1, FIELD2, FIELD3 FROM TABLE1,如果这三列的值在表中都是唯一的。

例如,如果您的名字有多个相同的值,但所选列中的姓和其他信息不同,则该记录将包含在结果集中。

您正在寻找一个由:

select *
from table
group by field1

偶尔也可以用不同的on语句来写:

select distinct on field1 *
from table

然而,在大多数平台上,上述两种方法都不能工作,因为其他列上的行为未指定。(第一种方法适用于MySQL,如果你使用的是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)上,您需要编写子查询,使您将整个表与其本身连接起来(示例),所以不推荐。

对于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的每个不同组合进行行计数。

这是一个非常好的问题。我已经在这里读到了一些有用的答案,但也许我可以补充一个更精确的解释。

只要不查询额外的信息,使用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

or:

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  * from table where field1 in 
(
  select distinct field1 from table
)

这样,如果field1在多个行中有相同的值,将返回所有记录。