1

我想根據列(在查詢內創建的)「alpha_ssc_key」從列表中重複出現表中的重複項。然而,當我運行這個查詢時,它只是返回所有結果(而不是消除「alpha_ssc_key」重複的行)。任何幫助將不勝感激!使用DISTINCT在BigQuery中刪除標準SQL中的重複項

這是在BigQuery中完成的。

WITH ssc_test_view AS (
    SELECT 
    DISTINCT CONCAT(CAST(date AS STRING), ciq_id, CAST(quantity AS STRING), CAST(cost_basis AS STRING),fund,security,class,inv_type,share_type) AS alpha_ssc_key, 
    _metadata_created_at AS file_date, 
    realized_gain_loss, 
    cusip, 
    acq_txn_no, 
    acquisition_date, 
    security, 
    company, 
    ticker, 
    ciq_id, 
    class, 
    inv_type, 
    dis_txn_no, 
    quantity, 
    categorization, 
    transaction_type, 
    cost_basis, 
    share_type, 
    fund, 
    net_proceeds, 
    unit_cost 
    FROM 
    `fcm-dw.acquisition_ssc.ssc_log`) 
SELECT 
    * 
FROM 
    ssc_test_view 

回答

0

DISTINCT適用於所有列 - 不只是你的關鍵 - 這就是爲什麼仍然返回所有行。在你的情況下更好地按照複合鍵的字段進行分組,但是你需要決定實際的重複數據刪除的邏輯。在下面的例子中使用MIN。但是你可以使用適合於您的需求

任何聚合功能可以嘗試下面

#standardSQL 
WITH ssc_test_view AS (
    SELECT 
    date, 
    ciq_id, 
    quantity, 
    cost_basis, 
    fund, 
    security, 
    class, 
    inv_type, 
    share_type, 
    MIN(_metadata_created_at) AS file_date, 
    MIN(realized_gain_loss) AS realized_gain_loss, 
    MIN(cusip) AS cusip, 
    MIN(acq_txn_no) AS acq_txn_no, 
    MIN(acquisition_date) AS acquisition_date, 
    MIN(company) AS company, 
    MIN(ticker) AS ticker, 
    MIN(dis_txn_no) AS dis_txn_no, 
    MIN(categorization) AS categorization, 
    MIN(transaction_type) AS transaction_type, 
    MIN(net_proceeds) AS net_proceeds, 
    MIN(unit_cost) AS unit_cost, 
    FROM `fcm-dw.acquisition_ssc.ssc_log` 
    GROUP BY 
    date, 
    ciq_id, 
    quantity, 
    cost_basis, 
    fund, 
    security, 
    class, 
    inv_type, 
    share_type) 
SELECT * FROM ssc_test_view 
+0

在這種情況下min函數的功能是什麼?剛開始呢? –

+0

它爲各自的領域取最小值。正如我所提到的那樣 - 你可以使用任何重複邏輯 - 但你只需要爲分組列表外的那些字段「選擇」一個值 –

+0

所以我現在可以省略像MIN()這樣的聚合邏輯,因爲我沒有試圖根據這些記錄去除雜草,對嗎?想象一下我上面提到的關鍵是我想用來重複數據集的領域。我應該使用該密鑰來重複數據刪除? –

0

試試這個:

SELECT stv.* 
FROM (SELECT stv.*, 
      ROW_NUMBER() OVER (PARTITION BY alpha_ssc_key ORDER BY _metadata_created_at DESC) as seqnum 
     FROM ssc_test_view stv 
    ) stv 
WHERE seqnum = 1; 
+0

什麼是STV。*代表?或者你能給我一些關於這裏的邏輯 –

+0

@DaveChappelle的見解。 。 。 'stv'是一個表別名,沒有正確定義。 –