2014-09-23 155 views
1

我想选择此表的所有行,其中前两列是唯一的([RegisterId],[DeviceSerial])。目前,DISTINCT关键字也匹配RegisterName,我希望它忽略它。我怎样才能做到这一点?请注意,这两列构成复合键的一部分,如果这很重要的话。选择具有唯一2列组合的行(不同)

SELECT DISTINCT [RegisterId] 
        ,[DeviceSerial] 
        ,[RegisterName],0 AS Contribution 
       FROM [RegisterCountLogs] 
       WHERE DeviceSerial = 2160563829 
+0

能,如果你只是把'选择disinct' 2列部分的为子查询并选择在外部查询工作的呢? (即RegisterId主键,或者是(RegisterId,DeviceSerial)组合中唯一的表) – DrCopyPaste 2014-09-23 14:51:12

+0

我的SQL技能严重生锈,您能发布查询吗? – Chris 2014-09-23 14:51:50

+1

如果该组合具有多个“RegisterName”值,您想要哪个值? – 2014-09-23 14:51:58

回答

4

您可以通过

SELECT [RegisterId] 
    ,[DeviceSerial] 
    , Max ([RegisterName]),0 AS Contribution 
FROM [RegisterCountLogs] 
WHERE DeviceSerial = 2160563829 
GROUP BY [RegisterId] 
    ,[DeviceSerial] 

做1组现在,如果你只是想有RegisterId和DeviceSerial的一个组合行,那么你就必须添加一个HAVING

SELECT [RegisterId] 
    ,[DeviceSerial] 
    , Max ([RegisterName]),0 AS Contribution 
FROM [RegisterCountLogs] 
WHERE DeviceSerial = 2160563829 
GROUP BY [RegisterId] 
    ,[DeviceSerial] 
HAVING Count (*) = 1 

编辑

在进一步思考,你可能希望在最新/最新注册的名称。

SELECT [RegisterId] 
    , [DeviceSerial] 
    , [RegisterName] 
    , 0 AS Contribution 
FROM [RegisterCountLogs] 
Where RegisterId = 
(
    SELECT Max ([RegisterId]) 
    FROM [RegisterCountLogs] 
    WHERE DeviceSerial = 2160563829 
    GROUP BY [DeviceSerial] 
) 
+0

我曾试过这个,它抱怨RegisterName(是一个字符串),并不知道如何阻止它抱怨..谢谢! – Chris 2014-09-23 14:52:36

+0

根据您的更新...第一个查询工作正常,我只想要第二个,如果我想指定它只有一个匹配(而不是很多) – Chris 2014-09-23 14:53:27

+0

您可以发布您尝试的查询,并且实际的错误你收到的消息? – 2014-09-23 14:53:30

0

您可以使用自联接来清除不需要的记录。

(未测试的代码)

;WITH [CountLogs] as 
(
    SELECT [RegisterId],[DeviceSerial],[RegisterName], 0 AS Contribution 
    FROM [RegisterCountLogs] 
    WHERE DeviceSerial = 2160563829 
) 
SELECT RCL1.* 
FROM [CountLogs] RCL1 
INNER JOIN (SELECT DISTINCT [RegisterId],[DeviceSerial] FROM [CountLogs]) RCL2 
    ON RCL1.[RegisterId] = RCL2.[RegisterId] and RCL1.[DeviceSerial] = RCL2.[DeviceSerial]