转置字符串

3

我正在探索 mlb 棒球 statcast 数据,该数据是按照每个投球统计的。我想要在打席水平上总结这些投球。相关的列:

game_pk | pitcher_id | batter_id | inning | pitch_number | pitch_type | plt_apprnc_pk (unique)
----------------------------------------------------------------------------------------------
492321  |   542881   |   518466  |    2   |       1      |    FF      |   4923215428815184662
492321  |   543475   |   571448  |    1   |       2      |    SL      |   4923215434755714481
492321  |   543475   |   571448  |    1   |       1      |    FF      |   4923215434755714481
492321  |   543475   |   571448  |    1   |       3      |    FF      |   4923215434755714481

我正在处理一个只显示每个打席(plt_apprnc_pk)的一次迭代的查询,接着是投球编号列(第1个球、第2个球、第3个球等),分别显示相应投球编号的每种投球类型。实际上,我想通过投球编号转置投球类型。

plt_apprnc_pk (unique)| first_pitch | second_pitch | third_pitch
----------------------------------------------------------------
  4923215434755714481 |     SL      |      FF      |     FF


我尝试使用Case语句实现这个功能(例如CASE WHEN pitch_number = 1 THEN pitch_type END)。但是我得到了每个plt_apprnc_pk的多行结果。
plt_apprnc_pk (unique)| first_pitch | second_pitch | third_pitch
------------------------------------------------------------------
  4923215434755714481 |     SL      |      NULL    |    NULL
  4923215434755714481 |    NULL     |      FF      |    NULL
  4923215434755714481 |    NULL     |      NULL    |     FF

什么是将这些字符串基于pitch_number转置并保留唯一键的最佳方法?

首先,回答以下问题:每次出现的理论最大球数是多少?这就是您需要的列数,并且对于此结果中的每一行,您都需要该数量的列。 - Jon Armstrong
根据棒球规则,理论上没有限制。击球手可以无限次数地犯规。实际上,还没有击球手犯规无限次数的记录。 - Greg Pavlik
2个回答

6

我试着用CASE语句来做这件事(比如 CASE WHEN pitch_number = 1 THEN pitch_type END)。但是我得到了每个plt_apprnc_pk的多个行。

这里的模式被称为条件聚合:

SELECT plt_apprnc_pk
     ,MAX(CASE WHEN pitch_number = 1 THEN pitch_type END) AS first_pitch 
     ,MAX(CASE WHEN pitch_number = 2 THEN pitch_type END) AS second_pitch 
     ,MAX(CASE WHEN pitch_number = 3 THEN pitch_type END) AS thrid_pitch 
     -- ...
     --,MAX(CASE WHEN pitch_number = n THEN pitch_type END) AS nth_pitch 
FROM tab
GROUP BY plt_apprnc_pk;

注意:最大的 "pitch_number" 必须事先知道。

1

您可以在查询中使用类似这样的内容,我认为这是有用的:

ISNULL(max(case when pitch_number = 1 THEN pitch_type end),0) as Default_name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接