使用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
答
试试这个:
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'是一个表别名,没有正确定义。 –
在这种情况下min函数的功能是什么?刚开始呢? –
它为各自的领域取最小值。正如我所提到的那样 - 你可以使用任何重复逻辑 - 但你只需要为分组列表外的那些字段“选择”一个值 –
所以我现在可以省略像MIN()这样的聚合逻辑,因为我没有试图根据这些记录去除杂草,对吗?想象一下我上面提到的关键是我想用来重复数据集的领域。我应该使用该密钥来重复数据删除? –