我在資料庫中有一些抓取的產品數據,我想在我的網站上使用它們。 我想編寫一個查詢,返回標題為“%EXAMPLE%”的所有項目,但僅包含唯一的產品。
問題是我有 1 個項目的多行,我只想返回每個產品 1 行(我每天都會抓取,因此每天每個項目都會獲得額外的行)。行之間的唯一區別是它們有另一個日期和價格,因為這就是我所尋找的價格歷史記錄。
範例: 我們有 3 種商品:粉紅巧克力、粉紅蘋果和粉紅梨。 每個項目有 3 行,因為我刮擦了 3 次。 例如(出於本範例的目的,我沒有添加所有其他列):
產品ID | 標題 | 價格 | 可用 |
---|---|---|---|
ABC123DEF | 粉紅蘋果 | 0.47 | 1 |
ABC123DEF | 粉紅蘋果 | 0.42 | 1 |
ABC123DEF | 粉紅蘋果 | 0.41 | 1 |
ABC333FHG | 粉紅梨子 | 0.41 | 1 |
ABC333FHG | 粉紅梨子 | 0.41 | 1 |
ABC333FHG | 粉紅梨子 | 0.41 | 1 |
FH5845FJG | #粉紅巧克力 | 0.41 | 1 |
FH5845FJG | #粉紅巧克力 | 0.41 | 1 |
FH5845FJG | #粉紅巧克力 | 0.41 | 1 |
我想要得到的結果是:
產品ID | 標題 | 價格 | 可用 |
---|---|---|---|
ABC123DEF | 粉紅蘋果 | 0.47 | 1 |
ABC333FHG | 粉紅梨子 | 0.41 | 1 |
FH5845FJG | #粉紅巧克力 | 0.41 | 1 |
看來我必須搜尋標題,然後過濾掉重複的productId,以便得到正確的結果。但我不知道該怎麼做。
有什麼想法嗎?
P粉2983052662024-04-03 00:53:42
一個例子:
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn FROM test ) DELETE test FROM test NATURAL JOIN cte WHERE cte.rn > 1;
查詢儲存每個產品 ID 的最高價格行,並刪除該產品的其他行。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40df8e8e4b3eb206e0f73b7ce3a70a a5一个>
注意 - 必須儲存的每個完整行都是唯一的(必須刪除的行可能具有完整的重複項)。
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn FROM test ) SELECT * FROM cte WHERE rn = 1;
此查詢不需要行是唯一的,在這種情況下只傳回一個行副本。如果您需要所有副本,請使用 RANK() 或 DENSE_RANK() 而不是 ROW_NUMBER()。
MySQL 5.x 版本的解決方案。
SELECT * FROM test WHERE NOT EXISTS ( SELECT NULL FROM test t WHERE test.productId = t.productId AND test.price < t.price );
此查詢將傳回所有副本(如果存在)。如果您只需要一份副本,請新增 DISTINCT。