出于某种原因,我的大脑无法理解这一点。我有一个'记录'包含列的表:id,name,genre,date
我想做一个将返回表中每条记录的查询,还有另一列,它具有相同类型和日期(日期)和频道(在.0005内)的所有记录的总和作为当前记录。希望这是有道理的。我将尝试说明:
表:record
id name genre date Channel
1 Scott rock 2014-01-21 30.0345
2 Jim rap 2014-01-21 55
3 Dave country 2014-01-22 23
4 Tim rock 2014-01-22 25
5 Dave rock 2014-01-21 34.0350
6 John rock 2014-03-24 23
7 Stan rap 2013-09-16 14
8 Jake country 2014-01-21 30
9 Mike country 2014-01-22 22.9995
10 Jodi country 2015-01-22 23.0006
11 Jodi country 2015-01-22 23.0004
这就是我希望我的查询返回的内容:
id name genre date Channel same_day_count
1 Scott rock 2014-01-21 30.0345 2
2 Jim rap 2014-01-21 55 1
3 Dave country 2014-01-22 23 3
4 Tim rock 2014-01-22 25 1
5 Dave rock 2014-01-21 30.0350 2
6 John rock 2014-03-24 23 1
7 Stan rap 2013-01-21 14 1
8 Jake country 2014-01-21 30 1
9 Mike country 2014-01-22 22.9995 3
10 Jodi country 2015-01-22 23.0006 1
11 Jodi country 2015-01-22 23.0004 3
请帮助:对于SQL专家来说,这可能非常简单。请记住,整个时间戳不需要匹配,即小时:分钟:秒。它只需要是相同的yyyy-mm-dd
实际上在审查之后。我认为same_day专栏含糊不清。但是,频道会有所不同,并且足够独特,我相信只要实际上可以在SQL中执行此操作,它就会给出准确的结果
答案 0 :(得分:2)
select *,
(select count(*)
from table as b
where a.genre=b.genre and
cast(a.date as date) = cast(b.date as date)) as same_day_count
from table as a
语法在不同的rdbms
中可能会有所不同答案 1 :(得分:1)
执行此操作的标准方法是使用窗口函数。假设您的date
没有时间组件,则查询将为:
select r.*,
count(*) over (partition by genre, date) as same_day_count
from record r;
这是ANSI标准功能,可在大多数(但不是全部)数据库中使用。如果您的日期有时间组件,则需要将其删除。以下是两种常用方法,具体取决于数据库:
select r.*,
count(*) over (partition by genre, cast(date as date)) as same_day_count
from record r;
或:
select r.*,
count(*) over (partition by genre, trunc(date)) as same_day_count
from record r;
答案 2 :(得分:0)
您可以创建按流派和日期总计的子查询,然后将其加入记录表:
SELECT r.id, r.name, r.genre, r.date, s.recordCount
FROM record r
INNER JOIN (
SELECT genre, DATEPART(DAY, date) AS day, COUNT(*) as recordCount
FROM record
GROUP Y genre, DATEPART(DAY, date)
) s ON s.genre = r.genre AND s.day = DATEPART(DAY, r.date)