SQL连接表中的对应值
Posted
技术标签:
【中文标题】SQL连接表中的对应值【英文标题】:SQL Joining corresponding values in a table 【发布时间】:2013-08-13 15:50:34 【问题描述】:所以我有一个表格(称为 tbl1),看起来像(但行数更多):
CUSIP_ID1 CUSIP_ID2 cor dt_pnts
921910709 06738G407 0.99613 252
739371102 06738G407 0.380706 213
808524654 06738G407 0.580574 221
78467V202 06738G407 0.366938 224
808524854 06738G407 0.0127264 232
78567V103 06738G407 0.0799898 198
等等
我的代码是(第二个表 tbl2 只是有一个我用来匹配值的 ID#)
insert into tbl3 (Ticker, cusip_id, maxcor)
select b.ID, a.CUSIP_ID1 No_indx_cusip, MAX(abs(a.cor)) maxcor
from tbl1 a, tbl2 b
where a.CUSIP_ID1 = b.CUSIP_ID
group by a.CUSIP_ID1, b.Ticker
order by maxcor desc
select * from tbl3
返回
Ticker No_Indx_cusip maxcor dt_pnts
EDV 921910709 0.99613 NULL
SCHR 808524854 0.989976 NULL
VGIT 92206C706 0.988307 NULL
ELD 97717X867 0.985073 NULL
PDP 73935X153 0.979131 NULL
TTFS 00768Y818 0.974691 NULL
SCHO 808524862 0.974254 NULL
RLY 78467V103 0.951472 NULL
PXLG 739371102 0.937278 NULL
VCIT 92206C870 0.934389 NULL
INKM 78467V202 0.921616 NULL
WDTI 97717W125 0.890677 NULL
CEW 97717W133 0.847838 NULL
我想从 tbl1 中选择与 max(abs(a.cor)) 值匹配的对应 dt_pnts 从 tbl1 到 tbl3(由于某种原因对我不起作用) - 即 0.99613 的值将对应于 dt_pnts价值 252。谢谢!
结果看起来像
Ticker No_Indx_cusip maxcor dt_pnts
EDV 921910709 0.99613 252
SCHR 808524854 0.989976 124
VGIT 92206C706 0.988307 252
ELD 97717X867 0.985073 79
PDP 73935X153 0.979131 89
TTFS 00768Y818 0.974691 252
SCHO 808524862 0.974254 198
RLY 78467V103 0.951472 38
PXLG 739371102 0.937278 138
VCIT 92206C870 0.934389 212
INKM 78467V202 0.921616 90
WDTI 97717W125 0.890677 16
CEW 97717W133 0.847838 153
【问题讨论】:
这么长的问题,我知道一个简单的解决方案,但只是想清楚! 你还没有在你当前的查询中为 dt_pts 写一列,使用连接会帮助你 使用隐式连接是一种可怕的编码实践。请改掉这个非常坏的习惯。 【参考方案1】:看起来您需要在 MAX(abs(a.cor)) 上附加连接到 tbl1 中的 cor 值,以检索最大 cor 值的实际 dt_pnts。我认为下面会起作用,因为它会重新连接到 CUSIP_ID1 上的 tbl1 表,并利用 HAVING 子句仅返回 cor 值等于 MAX(abs(a.cor)) 值的 dt_pnts 值:
select
b.ID, a.CUSIP_ID1 No_indx_cusip, MAX(abs(a.cor)) maxcor, dt.dt_pnts
from
tbl1 a INNER JOIN
tbl2 b ON
a.CUSIP_ID1 = b.CUSIP_ID INNER JOIN
(SELECT CUSIP_ID1, cor, dt_pnts FROM Table1) dt ON a.CUSIP_ID1 = dt.CUSIP_ID1
WHERE
a.dt_pnts > 10
group by a.CUSIP_ID1, b.ID, dt.dt_pnts, dt.cor
having dt.cor = MAX(abs(a.cor))
【讨论】:
我怎样才能添加一个条件来选择max(abs(a.cor))
for dt_pnts
> 10? @cgsmks
我认为您应该能够将 WHERE 子句添加到 (SELECT CUSIP_ID1, cor, dt_pnts FROM Table1) 位,(SELECT CUSIP_ID1, cor, dt_pnts FROM Table1 WHERE dt_pnts > 10)
这将从 13 个结果中选择 10 个 .. 我想从原始表 (tbl1) 中为 dt_pnts > 10
选择 max(abs(a.cor))
...谢谢!
我编辑了上面的代码以说明 dt_pnts > 10 条件。【参考方案2】:
您忘记包含最后一列 (dt_pts) 的逻辑。在这里,我为 table3 添加了 dt_pts 列。试试这个,它可能对你有用。
insert into tbl3 (Ticker, cusip_id, maxcor, dt_pts)
select b.ID, a.CUSIP_ID1 No_indx_cusip, MAX(abs(a.cor)) maxcor, a.dt_pts dt_pts
from tbl1 a, tbl2 b
where a.CUSIP_ID1 = b.CUSIP_ID
group by a.CUSIP_ID1, b.Ticker
order by maxcor desc
select * from tbl3
【讨论】:
除了代码之外,还包括推理通常是一种很好的做法。 谢谢。我们希望人们从该网站中学习,并能够将答案应用于他们自己的具体问题。 这就是我在这里的原因。谢谢你告诉我。 它没有给我我想要的 13 个 dt_pnts 的相应值(使用max(abs(a.cor))
)它返回我在原始图表中拥有的所有 1000 多个值。 (顺便说一句,dt_pnts
也需要包含在 group by 子句中)以上是关于SQL连接表中的对应值的主要内容,如果未能解决你的问题,请参考以下文章