SQL-当连接不涵盖它们时,如何添加与ID直接对应的命名列

Posted

技术标签:

【中文标题】SQL-当连接不涵盖它们时,如何添加与ID直接对应的命名列【英文标题】:SQL- How to add in named columns directly corresponding to an ID when join doesn't cover them 【发布时间】:2021-06-21 07:13:40 【问题描述】:

我正在尝试根据日期、ID 和国家/地区加入两个表。表 1 有一个额外的列,直接对应于 ID 列 表一

| Date      | ID      |Country|ID name                 |Clicks
| ----------| --------|-------|------------------------|------- |
| 25/02/2021| 42587750|Spain  |Targeting Details Spain |5
| 26/02/2021| 42587750|Spain  |Targeting Details Spain |15

但是,另一个表对国家/地区的跟踪略有不同,所以看起来像这样

Table 2
| Date      | ID      |Country|Clicks
| ----------| --------|-------|------|
| 25/02/2021| 42587750|Spain  |4
| 25/02/2021| 42587750|France |1
| 26/02/2021| 42587750|Spain  |13
| 26/02/2021| 42587750|Italy  |2

我想查看所有国家/地区的案例,因此我目前已根据日期、ID 和国家/地区进行了完全联接。但是,这会产生这样的数据

Date table1.ID table1.Country table2.ID table2.Country ID name table1.Clicks table2.clicks
25/02/2021 42587750 Spain 42587750 Spain Targeting Details Spain 5 4
26/02/2021 42587750 Spain 42587750 Spain Targeting Details Spain 15 13
25/02/2021 42587750 France 1
25/02/2021 42587750 Italy 1

我用这个来加入:

from table1 full outer join table2 on table1.date=table2.date and table1.ID=table2.ID and table1.country=table2.country

当我参加比赛的所有 3 件事时,我都会输入所有正确的详细信息,但是当国家/地区不同时,我不再输入 ID 名称。

是否可以在国家不匹配的情况下,在拉入国家的同时拉出ID名称?

当我取出***信息时,我可以得到正确的数字,像这样

from table1 full outer join table2 on table1.date=table2.date and table1.ID=table2.ID 

我尝试使用 AVG 函数而不是 SUM 来获得点击次数,但这没有奏效。

【问题讨论】:

感谢@ankit 修复格式! 您期望不同国家/地区的 ID 名称值是什么?存储在哪里? 请提供样本数据和期望的结果来说明您想要做什么。 嗨@AnkitBajpai,我希望 ID 名称与 ID 匹配。因此,在这种情况下,我希望所有 42587750 个 ID 都将 Targeting Details Spain 作为 ID 名称 【参考方案1】:

您的查询结构是否使用coalesce()

select coalesce(t1.date, t2.date) as date,
       coalesce(t1.id, t2.id) as id,
       coalesce(t1.country, t2.country),
       coalesce(t1.idname, max(t1.idname) over (partition by coalesce(t1.id, t2.id)) as idname,
       t1.clicks, t2.clicks
from table1 t1 full outer join
     table2 t2
     on t1.date = t2.date and 
        t1.ID = t2.ID and
        t1.country = t2.country

【讨论】:

服务器正在注册这个位 ["max"(aggregate.line_item_id) OVER (PARTITION BY COALESCE(aggregate.line_item_id, dbm.line_item_id))] 作为聚合、窗口函数或分组函数,并抱怨在按功能分组内有这个 @Aki 。 . .那没有意义。那是一个窗口函数,Presto 应该可以很好地处理它。查询中没有聚合函数,所以我怀疑您正在运行的查询与此不同。 可能是因为我没有把正确的括号放在正确的位置。不过,谢谢@gordon,我会玩弄这条线 @Aki 。 . .我可以证明它可以使用其他数据库,但我不知道 Presto 在线的“小提琴”。

以上是关于SQL-当连接不涵盖它们时,如何添加与ID直接对应的命名列的主要内容,如果未能解决你的问题,请参考以下文章

当某些行已经存在时如何防止SQL插入? [复制]

求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?

sql根据一个字段更新另一字段

如何在 SQL 中的不同行上将多个时间段连接在一起?

左连接,右连接与内连接

如何使用连接表向数据库添加记录 - codeigniter