【问题标题】:Is there a way to count auto-incrementally?有没有办法自动递增计数?
【发布时间】:2022-06-21 16:19:49
【问题描述】:

问题是:

获取观看次数最多的 5 个播客,如果timeDuration > 29s 则计算每次收听(仅收录活跃歌曲)。每 29 秒将计为 1 次,因此它将基于 PodcastID 计数。 1 个多集播客,1 个多集播客。 我认为我使用了错误的条件,所以它不能得到我想要的。

这是我尝试过的:

SELECT TOP (5) E.ID,E.Name,R.PodcastID,
COUNT (R.PodcastID) TIMES
FROM (REPORT R JOIN EPISODE E ON R.PodcastID = E.PodcastID) JOIN 
PODCAST P ON P.ID = E.ID 
WHERE R.TimeDuration > 29 AND E.Status = 1
GROUP BY E.ID, E.Name,R.PodcastID
ORDER BY TIMES;

这是我创建的 3 个表:

--但是输出,在TIMES列,无论我做什么,它们都只计为1,虽然我已经在上面设置了变量:58s,116s(平均2、4次)

这是我想要的结果,但只获得前 5 个结果,虽然我选择了前 (5) 个,但图中是 6 个结果..

【问题讨论】:

  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 你展示的数据是你的结果还是你的样本数据?无论哪种方式,我们都需要一个完整的minimal reproducible example,其中包含示例数据、所需结果以及您的查询。
  • 我们需要查看您的表格以了解问题所在。也许您的联接中的某些东西会造成问题。尝试第一次删除前 5 名,看看是否有重复的歌曲。如果您确实收到重复的歌曲,请尝试删除您的加入,看看它会如何表现
  • 请发布完整的表结构和数据,如果我们看不到,则无法复制
  • Count 将简单地计算聚合中的行数。我认为这不是你想要的。听起来您想使用 sum(r.TimeDuration) / 29 或类似的东西。由于没有样本数据或所需的输出,这实际上只是一个猜测。

标签: sql sql-server


【解决方案1】:

如果我理解正确,那么报告行的意思是,有人在播客中听了音乐。该行包含以秒为单位的持续时间,您希望将其视为 29 秒的块数。因此,将持续时间除以 29 并使用它。

with listened as
(
  select
    id as id_podcast,
    sum(timeduration / 29) as times,
  from report1
  where timeduration > 29
  group by id
)
select top(5) with ties
  p.*, listened.times
from podcast p
join listened on listened.id_podcast = p.id
where  p.status = 1
order by listened.times desc;

您加入播客并报告他们的 ID 看起来很奇怪。报告的 ID 应标识报告而不是播客。好吧,我只是像您一样使用它,但创建了一个别名以使其可读。如果这只是您的错误,那么很容易纠正。

如果 timeduration 是整数,SQL Server 将顺便应用整数除法。如果您想使用分数,请除以 29.0 而不是 29。这可能会导致每个播客的总时间要高得多。

我正在使用WITH TIES 子句,这在查找前 n 行时很常见。如果您想将此限制为五个结果行,您可能必须从完整的顶部列表中任意选择行,然后删除该子句。

【讨论】:

  • 对不起,为了更正,计算PodcastID,而不是TimeDuration,我的错。
  • 我不明白。请编辑您的问题并显示这两个表的一些示例数据以及您对此示例数据的预期结果。
  • 我已经编辑了我的问题,请看一下,tks。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2019-09-16
相关资源
最近更新 更多