3

所以问题是这样的。我有一个包含 n 列数据的表,但我想为每组唯一的 3 列列出一行。

例如,假设表格的结构如下

ID | data1 | data2 | data3 | description | price | handler | creationTime | etc...

我想要做的是使用这个子查询:

SELECT distinct data1, data2, data3 FROM Table_1

... 获取 3 列的每个独特变体。但是我想为每个这样的结果从表中选择一个完整的行。

此查询用于大量使用并且需要优化,这就是为什么我不能使用表变量或 while 循环的原因。有什么提示吗?

4

3 回答 3

1

我认为您不了解 DISTINCT 的概念。如果你有:

ID  data1  data2 data3 description1 price1
ID  data1  data2 data3 description2 price2

你期望结果是什么?ID data1 data2 data3将只返回一次,但是对于那些在相等的列中不同的其他列应该发生什么?

你总能做到

select distinct ID,  data1,  data2, data3, MAX(description1), MAX(price1)

它会解析并给你一个结果,但它实际上并没有多大意义......

于 2012-07-12T11:55:23.653 回答
1

如果您使用的是 SQL Server,则可以使用公用表表达式来执行此操作:

with minRow(ID) as 
    (select min(ID)
    from    Table_1
    group by data1, data2, data3)
select  t1.*
from    Table_1 t1 join minRow m1 on t1.ID = m1.ID
于 2012-07-12T12:07:28.933 回答
1

你需要的是windows函数。这是从每个组返回“第一”行的查询:

select t.*
from (select t.*,
             row_number() over (partition by data1, data2, data3
                                order by (select NULL)) as seqnum
      FROM Table_1 t
     ) t
where seqnum = 1

(这还包括最后一个带有“1”的 seqnum 列。)

这个想法是为每一行提供一个序列号并取第一个。“order by”子句是必需的。此查询中的语法只是在 SQL Server 中表示“我不关心顺序”的一种有效方式——这在其他数据库中有所不同。

于 2012-07-12T14:30:58.883 回答