所以问题是这个。我有一个包含n列数据的表,但我想为每个唯一的3列列表列出一行。
例如,假设表的结构如下
ID | data1 | data2 | data3 | description | price | handler | creationTime | etc...
我正在尝试做的是使用这个子查询:
SELECT distinct data1, data2, data3 FROM Table_1
...获取3列的每个独特变体。但是我想从表格中为每个这样的结果选择一个完整的行。
此查询意味着相当繁重的使用,需要进行优化,这就是为什么我不能使用表变量或while循环的原因。任何提示?
答案 0 :(得分: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)
它会解析并给你一个结果,但它实际上没有多大意义......
答案 1 :(得分: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
答案 2 :(得分: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
(这也包括最终的seqnum列,其中包含“1”。)
这个想法是为每一行提供一个序列号,然后取第一行。 “order by”子句是必需的。此查询中的语法只是在SQL Server中说“我不关心顺序”的有效方式 - 这在其他数据库中有所不同。