1

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

进口1

账户、电话、子账户、locationid

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

这可以做到吗?谢谢

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

例子:

导入1

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

应该返回

进口1

001 123-4567 123 0110

001 123-0001 234 0220

002 222-2222 010 0110

003 333-3333 333 0330

这就是我的意图。

4

5 回答 5

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 列,但其他数据库产品有一个等效列。如果你这样做了,那么我上面介绍的最后一个解决方案就可以解决问题(只需将 UniqueCol 替换为你的 Identity 列的名称)。

于 2010-07-22T23:57:01.910 回答
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

编辑:我忘记了重要的部分。多哈。

SELECT * FROM #Table T
WHERE T.Id IN (
        SELECT MAX(Id) AS Id
        FROM #Table
        GROUP BY account, phone )
于 2010-07-22T23:19:05.313 回答
0

稍微优雅的解决方案:

SELECT account, phone, subaccount, locationid
FROM import1
WHERE account IN
(SELECT DISTINCT account, phone FROM import1)
于 2010-07-23T00:11:34.700 回答
0

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

如果我对您的理解正确,您可能需要按以下格式制作新表格或视图:

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

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

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

如果我误解了您要执行的操作,请告诉我...

更新:

您的建议的这个修改版本应该可以工作。只去掉了电话的最小值并添加了一个独特的:

Select distinct account, 
       phone, 
       min(subaccount), 
       min(locationid) 
from  import1 
group by account, phone
于 2010-07-22T23:36:41.347 回答
0
select account, min(phone), min(subaccount), min(locationid) 
from import1 
group by account, phone 

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

于 2010-07-23T00:23:52.890 回答