這里有一個類似的問題,但對于 Mysql。我需要在我的表中創建一個新列dbo.table,回傳客戶最常購買的水果。P_id并且Fruit_bought已經存在,但我想要第三列favourite_fruit(如下所示):
p_id Fruit_bought Favourite_fruit
7740319 Apple Apple
976942 Pear Pear
976942 Pear Pear
7740319 Apple Apple
7740319 Pear Apple
976942 Banana Pear
5674352 Pear Pear
5674352 Pear Pear
5674352 Pear Pear
兩列都是 VARCHAR。我該如何在sql中解決這個問題?我是新手,但我假設更改表?
uj5u.com熱心網友回復:
假設您只想創建一份關于每個人最喜歡的水果的報告,您可以使用以下查詢:
with cte as (
select p_id, fruit_bought, row_number() over (partition by p_id order by count(*) desc) as rn
from t
group by p_id, fruit_bought
)
select p_id, fruit_bought as favorite_fruit
from cte
where rn = 1
uj5u.com熱心網友回復:
就像我在評論中提到的那樣,我不會將其作為計算列來執行,因為您將永遠追逐自己的尾巴。你說的資料永遠不會改變,但這是從來沒有真實的; 我聽過這個借口太多次了,幾周/幾個月后我得到同樣的東西“我知道我說它不會改變,但它已經改變了,現在資料是錯誤的。你如何讓這些值自動更新?”。
因此,使用VIEW. 在 中VIEW,我使用一個視窗COUNT來找出每個人購買了每種水果的數量,然后用 iseFIRST_VALUE來獲取最喜歡的水果。如果出現平局,則按字母順序回傳第一個水果。完整復制如下:
CREATE TABLE dbo.YourTable (p_id int,
Fruit_bought varchar(20));
GO
INSERT INTO dbo.YourTable (p_id, Fruit_bought)
VALUES (7740319,'Apple'),
(976942,'Pear'),
(976942,'Pear'),
(7740319,'Apple'),
(7740319,'Pear'),
(976942,'Banana'),
(5674352,'Pear'),
(5674352,'Pear'),
(5674352,'Pear');
GO
CREATE VIEW dbo.YourView AS
WITH Counts AS(
SELECT p_id,
Fruit_bought,
COUNT(Fruit_bought) OVER (PARTITION BY P_id, Fruit_bought) AS Times_bought
FROM dbo.YourTable)
SELECT p_id,
Fruit_bought,
FIRST_VALUE(Fruit_bought) OVER (PARTITION BY P_id ORDER BY Times_bought DESC, Fruit_Bought ASC) AS Favourite_fruit
FROM Counts;
GO
SELECT *
FROM dbo.YourView;
GO
DROP VIEW dbo.YourView;
DROP TABLE dbo.YourTable;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404950.html
標籤:
上一篇:如何從表變數執行sql結果集
下一篇:從LEFTJOIN保存輸出表
