select idur,
max(case when seqnum = 1 then IDPIX end) as IDPIX_1,
max(case when seqnum = 2 then IDPIX end) as IDPIX_2,
max(case when seqnum = 3 then IDPIX end) as IDPIX_3
from (select t.*, row_number() over (partition by idur order by NULL) as seqnum
from t
) t
group by idur;
WITH
CTE AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY IDUR ORDER BY IDPIX) AS ROW_RANKING,
IDUR,
LEAD(IDPIX,0,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX1,
LEAD(IDPIX,1,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX2,
LEAD(IDPIX,2,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX3
FROM
@tbl
)
SELECT
IDUR,
IDPIX1,
IDPIX2,
IDPIX3
FROM
CTE
WHERE
ROW_RANKING = 1
2条答案
按热度按时间sycxhyv71#
SQLite不支持
row_number()
(或任何类似的东西),因此透视它是一个挑战。这很容易,但它并不能产生你所要求的东西。
编辑:
在Postgres中,您可以使用条件聚合或
crosstab()
:在MySQL中,最简单的方法是使用变量。
vs91vp4v2#
我知道这是一个老线程,所以也许SQLite当时没有row_number,但现在它有row_number,所以今天可以很容易地完成。
因此,假设您知道需要转换为列的行数(在示例中为3),则可以通过以下方式解决问题:
添加更多数据
我想再添加一点数据,这样您就可以看到两个独立的IDUR值从行转换为列
| 伊杜尔|IDPIX|
| - ------|- ------|
| 小行星2345|小行星4567|
| 小行星2345|小行星4568|
| 小行星2345|小行星4569|
| 小行星234|小行星4570|
| 小行星234|小行星4571|
| 小行星234|小行星4572|
使用电极导线
这里我们使用
LEAD
来获取当前行、下一行和下两行的IDPIX。(从技术上讲,我们不需要LEAD(IDPIX,0...
,我们可以直接获取IDPIX,但它使我们可以轻松地以统一的格式并排阅读和查看它们)。输出
| 伊杜尔|识别像素1|IDPIX 2接口|IDPIX 3接口|
| - ------|- ------|- ------|- ------|
| 小行星2345|小行星4567|小行星4568|小行星4569|
| 小行星234|小行星4570|小行星4571|小行星4572|