简体   繁体   中英

Select DISTINCT, return entire row

I have a table with 10 columns. I want to return all rows for which Col006 is distinct, but return all columns...

How can I do this?

if column 6 appears like this:

| Column 6 |
| item1    | 
| item1    | 
| item2    | 
| item1    | 

I want to return two rows, one of the records with item1 and the other with item2, along with all other columns.

In SQL Server 2005 and above:

;WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY id) rn
        FROM    mytable
        )
SELECT  *
FROM    q
WHERE   rn = 1

In SQL Server 2000 , provided that you have a primary key column:

SELECT  mt.*
FROM    (
        SELECT  DISTINCT col6
        FROM    mytable
        ) mto
JOIN    mytable mt
ON      mt.id = 
        (
        SELECT  TOP 1 id
        FROM    mytable mti
        WHERE   mti.col6 = mto.col6
        -- ORDER BY
        --      id
        --  Uncomment the lines above if the order matters
        )

Update:

Check your database version and compatibility level:

SELECT  @@VERSION

SELECT  COMPATIBILITY_LEVEL
FROM    sys.databases
WHERE   name = DB_NAME()

The key word "DISTINCT" in SQL has the meaning of "unique value". When applied to a column in a query it will return as many rows from the result set as there are unique, different values for that column. As a consequence it creates a grouped result set, and values of other columns are random unless defined by other functions (such as max, min, average, etc.)

If you meant to say you want to return all rows for which Col006 has a specific value, then use the "where Col006 = value" clause.

If you meant to say you want to return all rows for which Col006 is different from all other values of Col006, then you still need to specify what that value is => see above.

If you want to say that the value of Col006 can only be evaluated once all rows have been retrieved, then use the "having Col006 = value" clause. This has the same effect as the "where" clause, but "where" gets applied when rows are retrieved from the raw tables, whereas "having" is applied once all other calculations have been made (ie aggregation functions have been run etc.) and just before the result set is returned to the user.

UPDATE:

After having seen your edit, I have to point out that if you use any of the other suggestions, you will end up with random values in all other 9 columns for the row that contains the value "item1" in Col006, due to the constraint further up in my post.

You can group on Col006 to get the distinct values, but then you have to decide what to do with the multiple records in each group.

You can use aggregates to pick a value from the records. Example:

select Col006, min(Col001), max(Col002)
from TheTable
group by Col006
order by Col006

If you want the values to come from a specific record in each group, you have to identify it somehow. Example of using Col002 to identify the record in each group:

select Col006, Col001, Col002
from TheTable t
inner join (
  select Col006, min(Col002)
  from TheTable
  group by Col006
) x on t.Col006 = x.Col006 and t.Col002 = x.Col002
order by Col006
select * from yourTable where column6 in (select distinct column6 from yourTable);

You can use GROUP BY and MIN() to get the result.

Lets say that you have id as the primary_key . And we want to get all the DISTINCT values for a column lets say estimated_total , And you also need one sample of complete row with each distinct value in SQL . Following query should do the trick.

SELECT *, min(id)
FROM harvest 
GROUP BY estimated_total;
SELECT *
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A
CROSS APPLY 
( SELECT TOP 1 * FROM YourTable B 
  WHERE B.YourDistinctField = A.YourDistinctField ) AS NewTableName

I tried the answers posted above with no luck... but this does the trick!

create table #temp
(C1 TINYINT,
 C2 TINYINT,
 C3 TINYINT,
 C4 TINYINT,
 C5 TINYINT,
 C6 TINYINT)

INSERT INTO #temp
 SELECT 1,1,1,1,1,6
 UNION ALL SELECT 1,1,1,1,1,6
 UNION ALL SELECT 3,1,1,1,1,3
 UNION ALL SELECT 4,2,1,1,1,6

SELECT * FROM #temp

SELECT *
FROM(
SELECT ROW_NUMBER() OVER (PARTITION BY C6 Order by C1) ID,* FROM #temp
)T
WHERE ID = 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM