使用DISTINCT在BigQuery中删除标准SQL中的重复项

问题描述:

我想根据列(在查询内创建的)“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 

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()这样的聚合逻辑,因为我没有试图根据这些记录去除杂草,对吗?想象一下我上面提到的关键是我想用来重复数据集的领域。我应该使用该密钥来重复数据删除? –

试试这个:

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'是一个表别名,没有正确定义。 –