问题描述
我有一张桌子,我想将它从长转为宽。
The long format has 3 columns:
zipcode,category,zipnum
'12345','A','1'
'40348','2'
'16132','B','1'
'09428','2'
'14818','3'
'93182','C','1'
zipnum 列是每个邮政编码的行号,按类别分组。因此 zipnum 对于类别中的每个邮政编码都是唯一的。我试图实现的宽格式具有列类别、zipcode1、...、zipcodeN,其中 N 是整个表中 zipnum 的最大值。在这个例子中 N=3,但在我的实际数据集中 N 大约是 2000。
category,zipcode1,zipcode2,zipcode3
'A','12345','40348',NULL
'B','16132','09428','14818'
'C','93182',NULL,NULL
我对 sql 比较陌生 - 我知道如何在 Python、R 等中轻松完成此操作,但找不到使用 MysqL 的方法。坦率地说,我真的不知道从哪里开始。
解决方法
我建议您将它们组合成一个逗号分隔的字符串:
select category,group_concat(zip_code order by zipnum) as zip_codes
from t
group by category;
因为您的字符串会很长,所以您需要将 group_concat_max_len
设置为大于其默认值的值。
你为什么不想要这些作为列?好吧,MySQL 有一个表中 4,096 列的硬限制,我认为这个限制也适用于结果集。 The limit,though,is further complicated by the storage engine and other settings.。有足够的复杂性,我只是不想动态创建可能导致数千列的查询。
您可能会发现 JSON 结构比“纯”字符串更方便。 MySQL 也支持这一点。
,我认为使用 SQL 不容易做到这一点。例如,PostgreSQL 中有一个单独的库用于执行此操作(请参阅 here)。
但是 function DataConnection() {
const [rooms,setRooms] = useState();
useEffect(() => {
const db = fire.firestore();
return db.collection('rooms').onSnapshot((snapshot) => {
const postData = [];
snapshot.forEach((doc) => postData.push({...doc.data(),id:doc.id}));
setRooms(postData);
});
},[]);
console.log(rooms);
rooms.map((el) => {
return (<><li>Roomname: { el.roomName} </li><li>Roomcode: {el.roomCode}</li></>)
}
在这里可能会有所帮助,直接使用或间接使用来生成可以在该包之外使用的 SQL。我没有 MySQL,所以我在 PostgreSQL 和 SQLite 上测试了以下内容。我认为它也应该与 dbplyr
一起使用:
RMySQL
由 reprex package (v1.0.0) 于 2021 年 4 月 4 日创建