我的数据集如下:
Fruit Quantity
apple 1/2
apple 2/2
apple 2/2
orange 1/3
orange 1/1
orange 2/10
grape 4/10`
第一个数字是指每个水果所在的箱子。这是一个庞大的数据集,我想要一个可以汇总每个水果有多少箱子的sql代码。
我尝试过许多不同的方法,但无法识别数据集中的第一个数字。我也试过很多r包,包括ply和data.table来解决这个问题,但没有运气,但是使用这些工具或任何其他r包的任何想法都会受到赞赏。
有什么想法吗?
澄清 我想要的输出看起来像这样
fruit count
apple 2
orange 2
grape 1
使用sqlite寻找答案
答案 0 :(得分:0)
你可以使用字符串操作来获取字符串的一部分,然后在水果上分组,并确定有多少不同的包装箱数。
对于字段为ShippingRecords
的表Shipping
,该表为:
select Fruit, count(distinct Crate)
from (
select
Fruit = left(Shipping, charindex(' ', Shipping) - 1),
Crate = substring(Shipping, charindex(' ', Shipping) + 1, charindex('/', Shipping) - charindex(' ', Shipping) - 1)
from ShippingRecords
) y
group by Fruit
结果:
apple 2
grape 1
orange 2
SQL小提琴:http://sqlfiddle.com/#!6/0730b/1
如果Fruit
和Quantity
是单独的字段,那么它会变得更简单:
select Fruit, count(distinct Crate)
from (
select
Fruit,
Crate = left(Quantity, charindex('/', Quantity) - 1)
from ShippingRecords
) y
group by Fruit
SQL小提琴:http://sqlfiddle.com/#!6/51bf5/3
使用SQLite,您可以使用substr
和instr
函数:
select Fruit, count(*)
from (
select distinct
Fruit,
Crate = substr(Quantity, 1, instr(Quantity, '/') - 1)
from ShippingRecords
) y
group by Fruit
答案 1 :(得分:0)
使用左右分别获取名称和分数(如果有水果名称,则使用空格)。然后以相同的方式分割分数。在名为denormalizedFruits的表中假设一个名为fruits的列:
select Fruit
, left(Crates, charindex('/',Crates) - 1) as ReportedCrate
, right(Crates, charindex('/',reverse(Crates))-1) as ReportedTotalCrates
, count(*)over(partition by Fruit) as CratesInDatabse
from (
select left(fruit,charindex(' ',fruit)-1) as Fruit
,right(fruit,charindex(' ',reverse(fruit))-1) as Crates
from denormalizedFruit
) f
在SQLFiddle处查看。
答案 2 :(得分:0)
在sql下面将返回您想要实现的确切结果。 我假设以下内容:
表名:股票
列:水果,数量
您可能需要查找列名称。
SELECT Fruit, COUNT(Crates) AS [Count] FROM
(
SELECT DISTINCT Fruit,
STUFF(Quantity, -- Main String
CHARINDEX( '/',Quantity), -- Start
(LEN(Quantity)-CHARINDEX( '/',Quantity)+1), -- Length
'' -- Replace with empty string
) AS Crates
FROM [Stock]
) As Wrap
GROUP BY Fruit
ORDER BY [Count] DESC