我有一張這樣的桌子:
| machine | type | value | id |
----------- -------- ----------- ------
| 1 | a | 0.34 | 1 |
| 1 | b | 0.23 | 2 |
| 1 | b | 0.26 | 3 |
| 1 | b | 0.35 | 4 |
| 1 | a | 0.15 | 5 |
| 1 | b | 0.45 | 6 |
| 1 | b | 0.55 | 7 |
我想獲得一個表,其中行的型別為“a”作為列(在這種情況下,id 不相關)。例如:
| machine | value | value_col |
----------- -------- -----------
| 1 | 0.23 | 0.34 |
| 1 | 0.26 | 0.34 |
| 1 | 0.35 | 0.34 |
| 1 | 0.45 | 0.15 |
| 1 | 0.55 | 0.15 |
我嘗試了 SQL Server 資料透視功能,但無法獲得所需的結果。
有什么幫助嗎?
謝謝!
uj5u.com熱心網友回復:
用于CROSS APPLY()獲取最后一個a值
select t.machine, t.value, v.value_col
from tbl t
cross apply
(
select top 1 value_col = value
from tbl x
where x.id < t.id
and x.type = 'a'
order by id desc
) v
where t.type = 'b'
資料庫小提琴
uj5u.com熱心網友回復:
可以分三步完成,這讓我覺得有更干凈的方法(但我想不出它們)
- 創建一個識別符號來關聯所有應該共享一個
a值的行 - 使用視窗函式將該
a值復制到磁區的其余部分 - 過濾以僅包含
b行
例如...
WITH
a_partitioned AS
(
SELECT
*,
SUM(CASE WHEN type='a' THEN 1 ELSE 0 END) OVER (PARTITION BY machine ORDER BY id) AS a_partition
FROM
your_table
),
a_value_spread AS
(
SELECT
*,
MAX(CASE WHEN type = 'a' THEN value END) OVER (PARTITION BY machine, a_partition) AS a_value
FROM
a_partitioned
)
SELECT
*
FROM
a_value_spread
WHERE
type = 'b'
演示:https : //dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=9037c0d3e6d46e05ecbcfdd3777808cd
編輯
這是我真正膚淺的嘗試,嘗試嘗試哪個答案可能具有最低的處理開銷......
- https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=5433abb2181ff92be72cf9247d3ff0b0
在關聯子查詢版本中,資料的掃描是總成本的4%
- 因此,整個查詢“花費”~20 次索引掃描
在決議函式版本中,資料的掃描是總成本的12%
- 因此,整個查詢“花費”~8.3 次索引掃描
不過,這是一個非常小的資料集,并且是一個非常隨意構建的資料集。
- 我會針對您的實際資料運行實際的分析器
- 如果性能很重要
(如果相關子查詢方法“足夠快”,請務必使用它。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354049.html
標籤:sql sql-server 数据库 数据科学
上一篇:根據列選擇對應的列
下一篇:如何按時間范圍內的組進行磁區?
