4

我在这里和那里发现了一点,但没有什么能真正涵盖我所遇到的问题,所以在这里。我从亚马逊订购了一本书,但它不会再在这里了,我真的需要尽快

我有两个表,基本上包含以下内容。

Table A有用户 ID 号、登录名、胜负、平局

Table B有用户id号,游戏结束时,游戏状态

我想要的是创建一个存储过程,它将返回上周获胜的前 10 名。

Loginname | total wins, last 7 days | all wins | all losses | all ties
Name1     |         10              |   40     |     8      |      6
Name2     |          9              |   96     |    76      |      19

ETC....

到目前为止,我所拥有的是:

SELECT A.login,
       A.draws_count,
       A.losses_count,
       A.wins_count
FROM   [TableB] AS B
       INNER JOIN
       [TableA] AS A
       ON B.won_by_id = A.id
WHERE  B.win_defined_time > (GETDATE() - 7)
       AND B.state = 'OVER';

从那里我不知道如何返回我需要的表。任何帮助将不胜感激。(还请记住,两个表中都不存在“过去 7 天的总获胜次数”字段。)

4

1 回答 1

1

假设架构和示例数据如下:

CREATE TABLE [dbo].[Competitors]
(
    [id]         INT          NOT NULL,
    [login_name] VARCHAR (50) NOT NULL,
    [wins]       INT          NOT NULL,
    [losses]     INT          NOT NULL,
    [ties]       INT          NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Events]
(
    [id]            INT          NOT NULL,
    [Competitorid]  VARCHAR (50) NOT NULL,
    [EventDateTime] DATETIME     NOT NULL,
    [winner]        BIT          NOT NULL,
    [EventStatus]   VARCHAR (50) NOT NULL
) ON [PRIMARY]

INSERT  INTO Competitors (id, login_name, wins, losses, ties)
VALUES                  (1, 'Player 1', 40, 8, 6),
                        (2, 'Player 2', 96, 76, 19),
                        (3, 'Player 3', 1, 0, 0)

INSERT  INTO Events (id, Competitorid, EventDateTime, winner, EventStatus)
VALUES             (1, 1, '2013-01-25 01:05:25.000', 1, 'OVER'),
                   (2, 1, '2013-01-26 01:05:25.000', 1, 'OVER'),
                   (3, 1, '2013-01-27 14:05:25.000', 1, 'OVER'),
                   (4, 1, '2013-01-28 01:05:25.000', 1, 'OVER'),
                   (5, 1, '2013-01-29 15:05:25.000', 1, 'OVER'),
                   (6, 1, '2013-01-30 01:05:25.000', 1, 'OVER'),
                   (7, 1, '2013-01-31 22:05:25.000', 1, 'OVER'),
                   (8, 1, '2013-02-01 01:05:25.000', 1, 'OVER'),
                   (9, 1, '2013-02-02 21:05:25.000', 1, 'OVER'),
                   (10, 1, '2013-01-02 11:05:25.000', 0, 'INPROGRESS'),
                   (11, 1, '2013-01-30 01:05:25.000', 1, 'OVER'),
                   (12, 2, '2013-01-25 11:05:25.000', 1, 'OVER'),
                   (13, 2, '2013-01-26 01:05:25.000', 1, 'OVER'),
                   (14, 2, '2013-01-27 11:25:25.000', 1, 'OVER'),
                   (15, 2, '2013-01-28 01:05:25.000', 1, 'OVER'),
                   (16, 2, '2013-01-29 11:45:25.000', 1, 'OVER'),
                   (17, 2, '2013-01-30 01:45:25.000', 1, 'OVER'),
                   (18, 2, '2013-01-31 12:15:25.000', 1, 'OVER'),
                   (19, 2, '2013-02-01 01:05:25.000', 1, 'OVER'),
                   (20, 2, '2013-02-02 22:25:25.000', 1, 'OVER'),
                   (21, 2, '2013-02-02 15:05:25.000', 0, 'INPROGRESS'),
                   (22, 2, '2013-01-25 01:05:25.000', 1, 'OVER'),
                   (23, 1, '2013-01-30 01:05:25.000', 0, 'OVER'),
                   (24, 2, '2013-01-30 01:05:25.000', 0, 'OVER'),
                   (25, 3, '2012-01-30 01:05:25.000', 1, 'OVER')

您可以使用以下查询返回过去 7 天内获胜次数最多的十个人的姓名和获胜数据:

SELECT TOP 10 login_name,
              recent_wins,
              wins AS 'All Wins',
              losses AS 'All losses',
              ties AS 'All Ties'
FROM   Competitors
       INNER JOIN
       (SELECT   COUNT(*) AS recent_wins,
                 Competitorid
        FROM     events
        WHERE    winner = 1
                 AND eventdatetime BETWEEN GetDate() - 7 AND GetDate()
                 AND EventStatus = 'OVER'
        GROUP BY Competitorid) AS recent_event_winners
                 ON Competitors.ID = recent_event_winners.Competitorid;
ORDER BY recent_wins DESC

此查询的工作原理是将 Competitors 表中的数据与 events 表中的数据的子查询连接在一起,该子查询计算最近获胜的次数,然后获取前 10 个结果。对于在过去 7 天内获胜的用户,子查询返回用户在该时间段内结束的事件的获胜次数。

注意:任何一个查询都不会返回在该时间段内没有任何胜利的用户,因此结果可能少于 10 个结果。

可以在http://sqlfiddle.com/#!3/0ebc8/2找到具有上述 sql 创建脚本和查询的 SQL Fiddle

于 2013-02-03T04:39:15.797 回答