SQL DISTINCT,GROUP BY或....?

时间:2011-08-16 19:45:25

标签: sql tsql sql-server-2008 greatest-n-per-group

我有一个包含以下列的数据库

SKU | designID | designColor | width | height | price | etc.

SKU号码是唯一的,designID会重复。

基本上,我希望DISTINCTGROUP BY设计ID并获取行的其余部分的值,即使它们没有重复。

示例:

123 | A-1 | RED | 2 | 3 | $200 | etc.
135 | A-2 | BLU | 8 | 4 | $150 | etc.

毕竟,我应该可以通过任一列对它们进行排序。我已经尝试了GROUP BYDISTINCT但是没有它们返回行的其余值。

示例:

SELECT DISTINCT designID
FROM tbl_name

将返回

A-1  
A-2

,没有其他数据。

GROUP BY示例:

SELECT designID, designColor
FROM tbl_name
GROUP BY designID, designColor

将返回

A-01 | RED
A-02 | BLU

任何想法,所以我可以得到所有行值的DISTINCT结果吗?

提前致谢。

====================================

感谢大家所有的时间和提示,请让我描述一下;

基本上我需要消除重复的designID并只显示其中一个,并且它们中的哪一个,第一个,中间或最后一个并不重要。重要的是我展示的必须包含所有行信息,如SKU,价格,尺寸等。我不知道,也许我应该使用不同的代码而不是DISTINCT或GROUP BY。

这是我想要的数据库。

enter image description here

5 个答案:

答案 0 :(得分:5)

除非我误解,否则您可以在多列上SELECT DISTINCT

SELECT 
  DISTINCT designID,
  designColor,
  width,
  height,
  price
FROM tbl_name
ORDER BY designColor

这将为您提供所有唯一的行。例如,如果您有15个总行中的两个designID值,分别有2个和3个不同的designColor值,则会为您提供5行。

答案 1 :(得分:2)

如果他们都保证重复(100%即所有列),那么一个独特的将是你的朋友。即

SELECT DISTINCT design_id, designColor, width, height, price FROM tbl_name

除了SKU之外,这将为除了SKU之外的所有内容提供不同的值(这将永远是唯一的,并且会影响您的不同。

如果您想要唯一的designId值并且其他结果不同,那么您需要确定所需的值。如果你真的不在乎,你可以随意挑选和聚合函数(比方说,MIN)并使用GROUP BY

即。

SELECT designID, MIN(designColor) FROM tbl_name GROUP BY designID

这将为您提供唯一的设计ID和其他列的 a 值。

如果你想要最大偏斜的designID,你可以使用排名函数,即

;WITH rankedSKUs 
AS
( 
    SELECT SKU, ROW_NUMBER() OVER(ORDER BY SKU DESC) as id 
    FROM tbl_name
)
SELECT * 
FROM tbl_name T
WHERE EXISTS(SELECT * FROM rankedSKUs where id = 1 and SKU = T.sku)

这将返回每个不同designID的所有列,将SKU的最大值作为每个设计的权威。

答案 2 :(得分:2)

如果您不在意返回哪一行,可以使用MAXsubquery-group by

create table #test(
    SKU int,
    designID varchar(10),
    designColor varchar(10),
    width int,
    height int,
    price real,
    etc varchar(50)
)

insert into #test values(123, 'A-1' ,'RED', 2, 3, '200', 'etc')
insert into #test values(135, 'A-2' ,'BLUE', 8, 4, '150', 'etc')
insert into #test values(128, 'A-2' ,'YELLOW', 6, 9, '300', 'etc')

select t.*  FROM    #test t INNER JOIN
(
    SELECT    MAX(SKU) as MaxSKU,designID
    FROM      #test
    GROUP BY  designID
) tt 
ON t.SKU = tt.MaxSKU;

drop table #test;

结果:

SKU    designID designColor    width    height  price   etc
123      A-1       RED            2      3       200    etc
135      A-2       BLUE           8      4       150    etc

答案 3 :(得分:0)

如果你想要返回每个字段,你也可以删除distinct(假设你看起来像id)。

你的请求真的很奇怪,因为如果你说,

SELECT DISTINCT designID
FROM tbl_name

您将获得一个唯一设计ID列表,如果您在表格中查找具有这些ID的所有行,您将获得表格中的每一行

作为旁注,使用distinct通常意味着您设计的数据库非常糟糕(即未规范化)或您设计的查询非常糟糕(即,您知道,真的严重)。我的钱是前者。

答案 4 :(得分:0)

如果您使用LINQ,您可以使用以下内容:

get_data_context().my_table.GroupBy( t => t.designID ).Select( t => new { t.Key, 
    REST = t.Select( u => new { u.SKU , u.designID , u.designColor , u.width , 
    u.height , u.price } ) } );