根据Distinct Column值返回行数据

时间:2012-07-30 19:10:15

标签: sql tsql asp-classic azure azure-sql-database

我正在使用带有asp脚本的SQL Azure,并且在我的生活中,没有运气试图让它工作。我正在运行查询的表有很多列,但我想查询2列(名称和电子邮件)上的不同值,从那里我希望它返回整行的值。

我的查询现在是什么样的:

SELECT DISTINCT quote_contact, quote_con_email 
FROM quote_headers 
WHERE quote_contact LIKE '"&query&"%'

但我需要它来返回整行,以便我可以检索其他数据点。如果一年前我很聪明,我会为联系人创建一个单独的表,但那是一年前的事。

在我实施LiveSearch功能之前。

2 个答案:

答案 0 :(得分:0)

一种方法是使用CTE(公用表表达式)。使用此CTE,您可以按照某些条件对数据进行分区 - 即quote_contactquote_con_email - 并为每个分区的所有行开始SQL Server编号,按其他一些条件排序 - 即可能是SomeDateTimeStamp

所以尝试这样的事情:

;WITH DistinctContacts AS
(
   SELECT 
       quote_contact, quote_con_email, (other columns here),
       RN = ROW_NUMBER() OVER(PARTITION BY quote_contact, quote_con_email ORDER BY SomeDateTimeStamp DESC) 
   FROM 
       dbo.quote_headers
   WHERE
       quote_contact LIKE '"&query&"%'
)
SELECT 
   quote_contact, quote_con_email, (other columns here)
FROM 
   DistinctContacts
WHERE
   RowNum = 1

在这里,我只选择每个“分区”的最后一个条目(即每对名称/电子邮件) - 按时间戳以降序排列。

这会接近你想要的吗?

答案 1 :(得分:0)

您需要提供更多详细信息。 如果没有它们,我就能想到这一点:

WITH dist as (
SELECT DISTINCT quote_contact, quote_con_email, RANK() OVER(ORDER BY quote_contact, quote_con_email) rankID
FROM quote_headers 
WHERE quote_contact LIKE '"&query&"%'
),
data as (
SELECT *, RANK() OVER(ORDER BY quote_contact, quote_con_email) rankID FROM quote_headers 
)
SELECT * FROM dist d INNER JOIN data src ON d.rankID = src.rankID