列是:名稱、位置名稱、位置 ID
我想檢查 Names 和 Location_ID,如果有兩個相同,我想洗掉/洗掉該行。
例如:如果位置 id 4 的名稱 John Fox 出現兩次或多次,我只想保留一個。
之后,我想計算每個位置有多少人。Location_Name1: 45 Location_Name2: 66 Etc... 位置名稱和位置 ID 相關。 樣本資料
我試過的代碼
uj5u.com熱心網友回復:
洗掉重復項是一種常見模式。您將序列號應用于所有重復項,然后洗掉任何不是第一個的。在這種情況下,我可以任意訂購,但您可以選擇保留 PK 值最低的那個或最后修改的那個或其他 - 只需更新ORDER BY以對您想要首先保留的那個進行排序。
;WITH cte AS
(
SELECT *, rn = ROW_NUMBER() OVER
(PARTITION BY Name, Location_ID ORDER BY @@SPID)
FROM dbo.TableName
)
DELETE cte WHERE rn > 1;
然后進行計數,假設給定不能有兩個不同Location_ID的 s Location_Name(這就是模式 示例資料如此有用的原因):
SELECT Location_Name, People = COUNT(Name)
FROM dbo.TableName
GROUP BY Location_Name;
- 示例db<>fiddle
如果Location_Name和Location_ID不是緊密耦合的(例如,可能存在,那么如果按 分組,您將必須定義如何確定要顯示的位置,或者承認這些列中的一個可能沒有意義。Location_ID = 4, Location_Name = Place 1Location_ID = 4, Location_Name = Place 2Location_ID
如果Location_Name和Location_ID 是緊密耦合的,則它們不應都存盤在此表中。您應該有一個查找/維度表來存盤這兩個列(一次!),并且您使用最小的資料型別作為您在事實表中記錄的鍵(一遍又一遍地重復)。這有幾個好處:
- 掃描更大的表更快,因為它沒有那么寬
- 存盤空間減少,因為您不會一遍又一遍地重復長字串
- 聚合更清晰,聚合后可以加入取名字,會更快
- 如果您需要更改位置的名稱,您只需要在一個地方更改它
uj5u.com熱心網友回復:
示例代碼
CREATE TABLE People_Location
(
Name VARCHAR(30) NOT NULL,
Location_Name VARCHAR(30) NOT NULL,
Location_ID INT NOT NULL,
)
INSERT INTO People_Location
VALUES
('John Fox', 'Moon', 4),
('John Bear', 'Moon', 4),
('Peter', 'Saturn', 5),
('John Fox', 'Moon', 4),
('Micheal', 'Sun', 1),
('Jackie', 'Sun', 1),
('Tito', 'Sun', 1),
('Peter', 'Saturn', 5)
獲取位置和計數
select Location_Name, count(1)
from
(select Name, Location_Name,
rn = ROW_NUMBER() OVER (PARTITION BY Name, Location_ID ORDER BY Name)
from People_Location
) t
where rn = 1
group by Location_Name
結果
Moon 2
Saturn 1
Sun 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411238.html
標籤:
上一篇:執行存盤程序只列印最后一條記錄
下一篇:獲取多行相當于兩個欄位上的除法
