Sql h、 这取决于你是否想将听起来与一个地址相同(我想是同一个街道名称在该州的另一个城镇)的单独地址计算为一个地址。@lijie同意,但我认为即使是次选择的版本也不能真正满足froadie的要求,尽管他说了什么-我认为他更可能希望每个不同的地址有一行, sta
Sql h、 这取决于你是否想将听起来与一个地址相同(我想是同一个街道名称在该州的另一个城镇)的单独地址计算为一个地址。@lijie同意,但我认为即使是次选择的版本也不能真正满足froadie的要求,尽管他说了什么-我认为他更可能希望每个不同的地址有一行, sta,sql,join,self-join,Sql,Join,Self Join,h、 这取决于你是否想将听起来与一个地址相同(我想是同一个街道名称在该州的另一个城镇)的单独地址计算为一个地址。@lijie同意,但我认为即使是次选择的版本也不能真正满足froadie的要求,尽管他说了什么-我认为他更可能希望每个不同的地址有一行, state@jackpdouglas:是的,我认为这是我的真实意图(但在OP确认之前,我仍在读心术)。为此,只需在SELECT关键字后添加DISTINCT就足够了(我没有足够的经验知道,但如果我不需要子查询,我自然会尝试这样做)@lijie这会得到“
h、 这取决于你是否想将听起来与一个地址相同(我想是同一个街道名称在该州的另一个城镇)的单独地址计算为一个地址。@lijie同意,但我认为即使是次选择的版本也不能真正满足froadie的要求,尽管他说了什么-我认为他更可能希望每个不同的地址有一行, state@jackpdouglas:是的,我认为这是我的真实意图(但在OP确认之前,我仍在读心术)。为此,只需在
SELECT
关键字后添加DISTINCT
就足够了(我没有足够的经验知道,但如果我不需要子查询,我自然会尝试这样做)@lijie这会得到“正确”的行数,但是计数不起作用-看看我的答案,我会怎么做instead@jack:会发生什么事?重复计算会发生吗?但这意味着distinct被视为一个组?@lijie据我所知,您不能在任何RDBMS上的同一个select
中使用distinct
和count
等聚合。当然,你可以嵌套,这就是我在回答中所做的(你可以做count(distinct…
但我不认为这是你的意思)我以前没有使用过Oracle,所以我不能说这在SQL Server中是否有效,但在SQL Server中这是无效的,因为t2.address和t2.state不包含在GROUP BY子句中。@Jeremy:SQL Server是一个完全不同的东西。SQL的这部分是特定于Oracle的。啊,好的。感谢您的澄清。
ID Address State
12345 13 Phoenix NY
SELECT t1.Address, t1.State, COUNT(t2.address) As NumEntities
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t1.Address
13 Phoenix NY 3
13 Phoenix NY 9
SELECT Address, State,
(SELECT Count(*)
FROM TempAllAddresses innerQry
WHERE innerQry.address LIKE outerQry.address + '%'
AND innerQry.state = outerQry.state) As NumEntities
FROM TempAllAddresses outerQry
SELECT Orig_Address, State, COUNT(Similar_Address)
From
(
SELECT t1.Address Orig_Address,
t1.State State,
t2.address Similar_Address
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
AND t1.address <> t2.address
)
GROUP BY State, Orig_Address
SELECT t1.Address, t1.State, COUNT(distinct t2.id) As NumEntities
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t1.Address
SELECT t1.Address, t1.State, COUNT(t2.address) As NumEntities
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t1.Address
SELECT Address, State,
(SELECT Count(*)
FROM TempAllAddresses innerQry
WHERE innerQry.address LIKE outerQry.address + '%'
AND innerQry.state = outerQry.state) As NumEntities
FROM TempAllAddresses outerQry
SELECT t1.Address, t1.State, COUNT(t2.address) As NumEntities
FROM (select distinct Address, State from TempAllAddresses) t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t1.Address
SELECT Address, State, count(1) As NumEntities
FROM (
SELECT min(t1.Address) as Address, t1.State
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t2.Address
) GROUP By State, Address
SELECT t1.Address, t1.State,
COUNT(t2.address) OVER (PARTITION BY t2.state) As NumEntities
FROM TempAllAddresses t1
INNER JOIN TempAllAddresses t2
ON t1.state = t2.state
AND T2.Address LIKE t1.address + '%'
GROUP BY t1.State, t1.Address
DECLARE @TempAllAddresses TABLE
(
ID INT PRIMARY KEY IDENTITY(1, 1) NOT NULL
, [Address] VARCHAR(250) NOT NULL
, [State] CHAR(2) NOT NULL
)
INSERT INTO @TempAllAddresses
VALUES ('13 Phoenix', 'NY')
, ('13 Phoenix St', 'NY')
, ('13 Phoenix Street', 'NY')
, ('1845 Test', 'TN')
, ('1337 Street', 'WA')
, ('1845 T', 'TN')
SELECT
TempAddresses.ID
, TempAddresses.[Address]
, TempAddresses.[State]
, TempAddressesCounted.AddressCount
FROM @TempAllAddresses TempAddresses
CROSS APPLY
(
SELECT
COUNT(*) AS AddressCount
FROM @TempAllAddresses TempAddressesApply
WHERE TempAddressesApply.[Address] LIKE (TempAddresses.[Address] + '%')
AND TempAddressesApply.[State] = TempAddresses.[State]
) TempAddressesCounted
SELECT
TempAddresses.ID
, TempAddresses.[Address]
, TempAddresses.[State]
, COUNT(*) AS AddressCount
FROM @TempAllAddresses TempAddresses
INNER JOIN @TempAllAddresses TempAddressesJoin
ON TempAddressesJoin.[Address] LIKE (TempAddresses.[Address] + '%')
AND TempAddressesJoin.[State] = TempAddresses.[State]
GROUP BY TempAddresses.ID
, TempAddresses.[Address]
, TempAddresses.[State]