我需要使用SQL从表中获取一个唯一的数据子集

时间:2010-07-22 23:03:51

标签: sql unique dbase

我正在通过SQL命令使用Dbase表。我有以下免费表格可供使用。

import1

帐户,电话,子帐户,locationid

我需要第一次出现每个uinique帐户和手机的组合。表中没有一个字段是唯一的。我可以使用distinct限定符获取部分数据子集,但我还需要与其选择的记录相关的其他字段。

可以这样做吗? 感谢

编辑:我发现我需要限定所选记录必须保持完整。

示例:

Import1

001 123-4567 123 0110

001 123-0001 234 0220

001 123-4567 456 0011

002 222-2222 010 0110

003 333-3333 333 0330

应该返回

import1

001 123-4567 123 0110

001 123-0001 234 0220

002 222-2222 010 0110

003 333-3333 333 0330

这是我的意图。

5 个答案:

答案 0 :(得分:1)

首先,无论您如何切片,都需要一个唯一的密钥。它可以是列的组合,但绝对必须有一些唯一标识每一行的方法。没有它,你最好的办法就是增加这样的约束。除了该约束之外,还可以通过具有单个唯一列来最好地服务于此类型的请求。但是,如果您没有这样的列,则可以通过将它们连接在一起来从包含唯一键的列创建它:

Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where (Cast(T1.UniqueCol1 As varchar(100)) 
    + "|" + Cast(T2.UniqueCol2 As varchar(100)
    ... ) = (
            Select Min( Cast(T2.UniqueCol1 As varchar(100))
                        + "|" + Cast(T2.UniqueCol2 As varchar(100))
                        ... 
                        ) 
            From "Table" As T2
            Where T2.account = T1.account
                And T2.phone = T1.phone
            )

在这种情况下,UniqueCol1代表唯一键的一列,UniqueCol2代表下一列,依此类推。这无论如何都不是快速查询。保证单列保持唯一会使这个问题变得更加简单。有了这个,你可以做一些类似于Mike M的解决方案:

Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where UniqueCol = (
                    Select Min( T2.UniqueCol ) 
                    From "Table" As T2
                    Where T2.account = T1.account
                        And T2.phone = T1.phone
                    )

这里要做的一个重点是,在上述两个解决方案中,“第一个”仅由找到的最低排序键值确定。如果“第一个”需要由其他内容确定,例如日期时间列,则需要在帖子中提及。

修改

鉴于您的补充,这是一个导入,最简单的解决方案是将自动递增列添加到临时表。在SQL Server中,这将是IDENTITY列,但其他数据库产品具有等效项。如果你这样做,那么我上面提到的最后一个解决方案就可以解决问题(只需用你的Identity列的名称替换UniqueCol)。

答案 1 :(得分:0)

尝试以下方法:

SELECT *, ROW_NUMBER() OVER (Order By account) AS Id
INTO #Table FROM import1

现在你有了一个主键 -

    SELECT account, phone, MAX(Id) AS Id
    FROM #Table
    GROUP BY account, phone
编辑:我忘记了重要的一部分。 DOH。

SELECT * FROM #Table T
WHERE T.Id IN (
        SELECT MAX(Id) AS Id
        FROM #Table
        GROUP BY account, phone )

答案 2 :(得分:0)

听起来您想要一个独特的电话/帐户信息集合,然后您想获得该独特组合的每个子帐户和位置。这是对的吗?

如果我理解正确,您可能希望以下列格式制作新表或视图:

import1
-------
id  |Phone  | Account

SubAccount  //SubAccountId may not be needed here...
----------
SubAccountId  |ImportId  | SubAccount

ImportLocation
--------------
ImportId |LocationId

如果我错过了你想要做的事情,请告诉我......

<强>更新

您的建议的此修改版本应该有效。只有Min off of Phone并添加了一个截然不同的内容:

Select distinct account, 
       phone, 
       min(subaccount), 
       min(locationid) 
from  import1 
group by account, phone

答案 3 :(得分:0)

稍微优雅的解决方案:

SELECT account, phone, subaccount, locationid
FROM import1
WHERE account IN
(SELECT DISTINCT account, phone FROM import1)

答案 4 :(得分:0)

select account, min(phone), min(subaccount), min(locationid) 
from import1 
group by account, phone 

似乎是我的IDE(Visual Fox Pro v9)的最佳解决方案