比较来自多个数据集的数据

时间:2014-04-09 22:14:21

标签: sql sql-server

我会尽力解释我的问题,但如果需要更多细节,请告诉我。

我正在查询符合特定条件的一组ID,我想将它与另一个进行比较。因此,例如,我有2013年春季的50个ID,2013年夏季的39个ID,以及2013年秋季的53个ID。我希望能够将每个列表与其后的列表进行比较并输出ID(或者只是一个数量)两个人都在。

我现在可以通过在where子句中指定要比较的确切列表来执行此操作,但我希望能够让它运行多年,将一个列表与之后的列表进行比较。

编辑:

示例数据(现在我可以一次拉2个列表来比较它们):

SPRING2013IDS | SUMMER2013IDS | FALL2013IDS | SPRING2014IDS
01            | 01            | 01          | 01
02            | 02            | 04          | 02
03            | 04            | 05          | 03
04            | 05            | 08          | 08
05            | 08            | 10          | 09
06            | 10            | 12          | 12
07            | 11            | 13          | 13
08            | 12            | 14          | 14

我想比较列表并输出:

Spring2013toSummer2013 | Summer2013toFall2013
01                     | 01
02                     | 04
04                     | 05
05                     | 08
08                     | 10
                       | 12

依旧......
我真的甚至不需要最终结果中的ID号(金额会很好),因为我要做的只是计算从一个到下一个继续的ID的百分比,但我想我能做到这一点一旦我让流程变得更好,我自己就可以了。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

create table #MyData (
    Year    smallint    not null,
    Season  tinyint     not null,
    ID      char(2)     not null
    );

insert #MyData
values
    (2013, 1, 'aa'),
    (2013, 1, 'bb'),
    (2013, 1, 'cc'),

    (2013, 2, 'aa'),
    (2013, 2, 'bb'),
    (2013, 2, 'dd'),

    (2013, 3, 'aa'),
    (2013, 3, 'bb'),
    (2013, 3, 'dd'),
    (2013, 3, 'ff'),

    (2013, 4, 'aa'),
    (2013, 4, 'bb'),
    (2013, 4, 'dd'),
    (2013, 4, 'ff');

;with KeyGroup as
(
    select
        (d.Year * 10) + d.Season as SelectKey,
        Year,
        Season,
        d.ID
    from #MyData as d
)
, RankedID as
(
    select
        DENSE_RANK() OVER (order by sk.SelectKey) as rnk,
        Year,
        Season,
        sk.ID
    from KeyGroup as sk
)
select
    one.Year,
    one.Season,
    one.ID
from RankedID as one
inner join RankedID as following
    on following.ID = one.ID
    and following.rnk = one.rnk + 1;

让我解释一下。你曾要求每年和每年季节与下一季相比。第一项任务是生成一个值,其中“跟随”很容易确定。整数对此有好处,因为+1将为您提供以下整数。 RankedID CTE将提供所需的分组; KeyGroup使DENSE_RANK()功能变得简单,并且在Season中使用tinyint使得KeyGroup变得容易。可以使用CASE语句轻松地从季节为文本获得整数季节。

对于奖励积分,您可以将COUNT(1)添加到最终SELECT列表和

group by grouping sets (
    (one.Year, one.Season, one.ID),
    (one.Year, one.Season));

到查询的末尾,以获取差异数量 ID列表的计数。