我正在通过SQL命令使用Dbase表。我有以下免费表格可供使用。
帐户,电话,子帐户,locationid
我需要第一次出现每个uinique帐户和手机的组合。表中没有一个字段是唯一的。我可以使用distinct限定符获取部分数据子集,但我还需要与其选择的记录相关的其他字段。
可以这样做吗? 感谢
编辑:我发现我需要限定所选记录必须保持完整。
示例:
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
应该返回
001 123-4567 123 0110
001 123-0001 234 0220
002 222-2222 010 0110
003 333-3333 333 0330
这是我的意图。
答案 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)的最佳解决方案