计算单个帖子中的标签数量-数据浏览器

时间:2018-12-29 10:16:14

标签: sql sql-server tsql split dataexplorer

我正在尝试编写一个查询,该查询将计算单个帖子下的标签数量。我莫名其妙地无法将标签分成一行并计数这些标签。

Other posts建议创建一个将标签拆分的函数,但是您不能在数据交换上创建函数。

这是我到目前为止的查询,这将只为我提供“帖子”和“标签”中的帖子。

SELECT p.Id, p.Title, p.Tags, t.TagName
FROM Posts as p 
INNER JOIN Tags as t ON p.Id = t.Id

4 个答案:

答案 0 :(得分:2)

您可以使用Tags列计算标签数量:

SELECT Id, Title, Tags, LEN(Tags) - LEN(REPLACE(Tags, '<','')) AS tag_number
FROM Posts as p 
WHERE Id = 2647

SEDE Demo

答案 1 :(得分:1)

这接近猜测,但是我的魔幻水晶球(和马丁·史密斯)告诉我,您可能正在寻找类似这样的东西:

DECLARE @mokupPosts TABLE(ID INT IDENTITY, SomePost VARCHAR(250),Tags VARCHAR(250));
INSERT INTO @mokupPosts VALUES
 ('First post','<matlab><plot><ternary><ternplot>')
,('Second post','<powershell><java><python>')
,('Third post','<image><opencv><image-processing>');

-查询将针对每个Post返回多行,并分别包含每个令牌。

SELECT p.*
      ,B.token.value('text()[1]','varchar(100)') Token
FROM @mokupPosts p
CROSS APPLY(SELECT CAST('<x>' + REPLACE(REPLACE(REPLACE(REPLACE(p.Tags,'><','||'),'<',''),'>',''),'||','</x><x>') + '</x>' AS XML)) A(Casted)
CROSS APPLY A.Casted.nodes('/x') B(token);

您可以轻松地将其直接INNER JOIN Tags到令牌上的现有表COUNT()并执行成组的&, < and >

如果标签中可能包含禁止使用的字符(例如SELECT FOR XML PATH('')等),则可以使用附加的内部SELECT p.* ,B.token.value('text()[1]','varchar(100)') Token FROM @mokupPosts p CROSS APPLY(SELECT CAST('<x>' + REPLACE((SELECT REPLACE(REPLACE(REPLACE(p.Tags,'><','||'),'<',''),'>','') AS [*] FOR XML PATH('')),'||','</x><x>') + '</x>' AS XML)) A(Casted) CROSS APPLY A.Casted.nodes('/x') B(token); 来隐式转义它们:

&, < and >

更新:更简单的方法

注意:标签中不得包含元素名称中禁止使用的字符,例如>(还有更多)!

此查询将通过用/>替换结尾的/*来返回空元素列表 as xml 。然后,查询将使用local-name(.)来迭代它们,并通过SELECT p.* ,B.token.value('local-name(.)','varchar(100)')AS Token FROM @mokupPosts p CROSS APPLY(SELECT CAST(REPLACE(p.Tags,'>','/>') AS XML)) A(Casted) CROSS APPLY A.Casted.nodes('/*') B(token) 返回它们的名称:

{{1}}

结果与以上相同...

更新2:我刚刚尝试过此here

...而且有效:-)

答案 2 :(得分:0)

我猜你需要这样的东西

df.set_index(['movie_title','movieId'],inplace=True)
dict(zip(df.index.tolist(),df.values.tolist()))

{('Avatar', 1): [1.0, 1.0, 1.0, 1.0, 0.0],
 ('John Carter', 2): [1.0, 1.0, 0.0, 1.0, 0.0],
 ('Tangled', 3): [0.0, 1.0, 1.0, 0.0, 0.0]}

答案 3 :(得分:0)

您可以使用JOIN将其获取为

SELECT P.ID,
       P.Title,
       P.Tags,
       COUNT(Tags) TagsCount
FROM Posts P INNER JOIN PostTags PT
       ON P.Id = PT.PostId
WHERE P.ID = 53243136
GROUP BY P.ID,
         P.Title,
         P.Tags;

SEDE Demo

更新:

这也是另一种方式

SELECT P.ID,
       P.Title,
       P.Tags,
       COUNT(TT.Value) - 1 TagsCount
       FROM Posts P CROSS APPLY (SELECT Value FROM STRING_SPLIT(Tags, '>')) TT
WHERE P.ID = 53243136
GROUP BY P.ID,
         P.Title,
         P.Tags; 

SEDE Demo