具有非常规计算列的SQL查询

时间:2015-01-21 23:59:34

标签: sql

出于某种原因,我的大脑无法理解这一点。我有一个'记录'包含列的表: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中执行此操作,它就会给出准确的结果

3 个答案:

答案 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)