将特定行数据显示为列
Showing particular row data as column
我的table如下:
Date
Code
Price
MA5
MA20
2022-01-01
APPLE
1000
1080
1090
2022-01-02
APPLE
1100
1084
1100
2022-01-03
APPLE
1200
1090
1100
2022-01-01
MICROSOFT
7
9
10
2022-01-02
MICROSOFT
7.5
8
9.5
2022-01-03
MICROSOFT
8
8.5
9
...
...
...
...
...
2022-01-01
NASDAQ
14400
15600
16700
2022-01-02
NASDAQ
14500
15200
16100
2022-01-03
NASDAQ
14600
15000
16000
我目前正在使用 MariaDB 在同一个 table 上保存纳斯达克价值和股票数据。
但是,我想将纳斯达克的 MA 值作为新列字段显示到字段的其余部分,如 NASDAQ_MA5、NASDAQ_MA20。
我的问题是,如何select nasdaq 的 MA5 和 MA20 值并将其作为匹配日期的值?我想要的输出如下:
Date
Code
Price
MA5
MA20
NASDAQ_MA5
NASDAQ_MA20
2022-01-01
APPLE
1000
1080
1090
15600
16700
2022-01-02
APPLE
1100
1084
1100
15200
16100
2022-01-03
APPLE
1200
1090
1100
15000
16000
2022-01-01
MICROSOFT
7
9
10
15600
16700
2022-01-02
MICROSOFT
7.5
8
9.5
15200
16100
2022-01-03
MICROSOFT
8
8.5
9
15000
16000
我一直在尝试以下方法:
SELECT *,
(PARTITION BY DATE, case when (code='NASDAQ') then MA5 else NULL end) as 'NASDAQ_MA5',
(PARTITION BY DATE, case when (code='NASDAQ') then MA20 else NULL end) as 'NASDAQ_MA20'
FROM TABLE
非常感谢您的帮助。
我确信有一种更有效的方法可以做到这一点,但这里有一种方法可以使用 2 个子查询来解决您的问题:
SELECT t1.*, (SELECT t2.MA5
FROM tableA t2
WHERE t1.date = t2.date
AND code = 'NASDAQ') as NASDAQ_MA5,
(SELECT t2.MA20
FROM tableA t2
WHERE t1.date = t2.date
AND code = 'NASDAQ') as NASDAQ_MA20
FROM tableA t1
WHERE code != 'NASDAQ'
试试看 here。
您可以在日期列上进行自联接并按 CODE = 'NASDAQ' 分隔数据。这是一种执行此操作的方法:
select a.*, b.ma5 as NASDAQ_MA5, b.ma20 as NASDAQ_MA20 from table1 a
left outer join (select date, ma5,ma20 from table1 where code = 'NASDAQ') b
on a.date = b.date where a.code <> 'NASDAQ'
您需要连接两组不同的数据。定义一个 CTE 以保持定义清晰可能是有意义的,然后加入您的主要 table - 如果总是有相应的日期,则可以是 内部加入 或 左加入如果可能没有。
这假设每个日期只有一个纳斯达克代码,如果不是这种情况,您可以根据需要在 CTE 中汇总。
with nasdaq as (
select date, MA5 NASDAQ_MA5, MA20 NASDAQ_MA20
from t
where code = 'NASDAQ'
)
select t.*, n.NASDAQ_MA5, n.NASDAQ_MA20
from t
left join nasdaq n on n.date=t.date
where t.code != 'NASDAQ';
我的table如下:
Date | Code | Price | MA5 | MA20 |
---|---|---|---|---|
2022-01-01 | APPLE | 1000 | 1080 | 1090 |
2022-01-02 | APPLE | 1100 | 1084 | 1100 |
2022-01-03 | APPLE | 1200 | 1090 | 1100 |
2022-01-01 | MICROSOFT | 7 | 9 | 10 |
2022-01-02 | MICROSOFT | 7.5 | 8 | 9.5 |
2022-01-03 | MICROSOFT | 8 | 8.5 | 9 |
... | ... | ... | ... | ... |
2022-01-01 | NASDAQ | 14400 | 15600 | 16700 |
2022-01-02 | NASDAQ | 14500 | 15200 | 16100 |
2022-01-03 | NASDAQ | 14600 | 15000 | 16000 |
我目前正在使用 MariaDB 在同一个 table 上保存纳斯达克价值和股票数据。
但是,我想将纳斯达克的 MA 值作为新列字段显示到字段的其余部分,如 NASDAQ_MA5、NASDAQ_MA20。
我的问题是,如何select nasdaq 的 MA5 和 MA20 值并将其作为匹配日期的值?我想要的输出如下:
Date | Code | Price | MA5 | MA20 | NASDAQ_MA5 | NASDAQ_MA20 |
---|---|---|---|---|---|---|
2022-01-01 | APPLE | 1000 | 1080 | 1090 | 15600 | 16700 |
2022-01-02 | APPLE | 1100 | 1084 | 1100 | 15200 | 16100 |
2022-01-03 | APPLE | 1200 | 1090 | 1100 | 15000 | 16000 |
2022-01-01 | MICROSOFT | 7 | 9 | 10 | 15600 | 16700 |
2022-01-02 | MICROSOFT | 7.5 | 8 | 9.5 | 15200 | 16100 |
2022-01-03 | MICROSOFT | 8 | 8.5 | 9 | 15000 | 16000 |
我一直在尝试以下方法:
SELECT *,
(PARTITION BY DATE, case when (code='NASDAQ') then MA5 else NULL end) as 'NASDAQ_MA5',
(PARTITION BY DATE, case when (code='NASDAQ') then MA20 else NULL end) as 'NASDAQ_MA20'
FROM TABLE
非常感谢您的帮助。
我确信有一种更有效的方法可以做到这一点,但这里有一种方法可以使用 2 个子查询来解决您的问题:
SELECT t1.*, (SELECT t2.MA5
FROM tableA t2
WHERE t1.date = t2.date
AND code = 'NASDAQ') as NASDAQ_MA5,
(SELECT t2.MA20
FROM tableA t2
WHERE t1.date = t2.date
AND code = 'NASDAQ') as NASDAQ_MA20
FROM tableA t1
WHERE code != 'NASDAQ'
试试看 here。
您可以在日期列上进行自联接并按 CODE = 'NASDAQ' 分隔数据。这是一种执行此操作的方法:
select a.*, b.ma5 as NASDAQ_MA5, b.ma20 as NASDAQ_MA20 from table1 a
left outer join (select date, ma5,ma20 from table1 where code = 'NASDAQ') b
on a.date = b.date where a.code <> 'NASDAQ'
您需要连接两组不同的数据。定义一个 CTE 以保持定义清晰可能是有意义的,然后加入您的主要 table - 如果总是有相应的日期,则可以是 内部加入 或 左加入如果可能没有。
这假设每个日期只有一个纳斯达克代码,如果不是这种情况,您可以根据需要在 CTE 中汇总。
with nasdaq as (
select date, MA5 NASDAQ_MA5, MA20 NASDAQ_MA20
from t
where code = 'NASDAQ'
)
select t.*, n.NASDAQ_MA5, n.NASDAQ_MA20
from t
left join nasdaq n on n.date=t.date
where t.code != 'NASDAQ';