【问题标题】:SQL TOP 10 Ranking Query Help RequiredSQL TOP 10 排名查询需要帮助
【发布时间】:2010-02-12 11:16:47
【问题描述】:

我有下面的代码,我试图找出上个月使用的前 10 台服务器,但是遇到了问题,SQL 不太好。如果可能,需要一些帮助或建议。

我在排名前 10 的应用程序上实现了这一点,但不知道如何在排名前 10 的服务器上实现这一点。

SELECT TOP 10 dbo_LU_SERVERNAME.SERVERNAME, Count(*) AS SessionNumbers
FROM dbo_LU_SERVERNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_SERVERNAME.PK_SERVERNAMEID = dbo_SDB_SESSION.FK_SERVERNAMEID
WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-30,Now())))
GROUP BY dbo_LU_SERVERNAME.SERVERNAME
ORDER BY Count(*) DESC;

UNION ALL SELECT "Other" AS SERVERNAME, Count(*) AS SessionNumbers
FROM (dbo_LU_SERVERNAME
INNER JOIN dbo_SDB_SESSION  
ON dbo_LU_SERVER.PK_SERVERID = dbo_SDB_SESSION.FK_SERVERID)  
LEFT JOIN (SELECT TOP 10 dbo_LU_SERVERNAME.SERVERNAME, Count(*) AS SessionNos 
           FROM dbo_LU_SERVERNAME
           INNER JOIN dbo_SDB_SESSION 
           ON dbo_LU_SERVER.PK_SERVERID = dbo_SDB_SESSION.FK_SERVERID
           WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-31,Now())))
           GROUP BY dbo_LU_SERVERNAME.SERVERNAME
           ORDER BY Count(*) DESC) AS s  ON dbo_LU_SERVERNAME.SERVERNAME = s.SERVERNAME

WHERE s.SERVERNAME Is Null
GROUP BY "Other";

这是适用于前 10 个应用程序的 SQL。

SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos
FROM dbo_LU_APPNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID
WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-30,Now())))
GROUP BY dbo_LU_APPNAME.APPNAME
ORDER BY Count(*) DESC;

UNION ALL SELECT "Other" AS APPNAME, Count(*) AS SessionNos 
FROM (dbo_LU_APPNAME
INNER JOIN dbo_SDB_SESSION  
ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID)  
LEFT JOIN (SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos 
           FROM dbo_LU_APPNAME
           INNER JOIN dbo_SDB_SESSION 
           ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID
           WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-31,Now())))
           GROUP BY dbo_LU_APPNAME.APPNAME
           ORDER BY Count(*) DESC) AS s  ON dbo_LU_APPNAME.APPNAME = s.APPNAME

WHERE s.APPNAME Is Null
GROUP BY "Other";

请注意,这些表格的相关性如下: dbo_LU_SERVER ---> FK_SERVERNAMEID, PK_SERVERID dbo_LU_SERVERNAME ---> PK_SERVERNAMEID dbo.SDB.SESSION ---> FK_SERVERID

我不确定自己做错了什么。

请帮忙。

谢谢

【问题讨论】:

  • 您在问题中没有解释的是 UNION ALL 的使用。我猜测这是未包含在前 10 名列表中的所有服务器会话的总数。因此,您的最终列表将是 11 行,前 10 台服务器,然后是所有其他会话的计数。
  • 您已使用 SQL、ms-access 和 visual-basic 标记您的问题。我假设您正在为 Access 编写此查询,但是 VB 部分是从哪里来的?
  • 这是来自stackoverflow.com/questions/2205902/… 不是吗?
  • 是的,看起来一样。也许这个问题应该结束了。
  • 我想问题是添加了日期,所以无论日期如何,Other 都包括所有内容。

标签: sql ms-access ranking


【解决方案1】:

我设法回答了我的问题。

SELECT TOP 10 dbo_LU_SERVERNAME.SERVERNAME, Count(*) AS SessionNumbers
FROM dbo_LU_SERVERNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_SERVERNAME.PK_SERVERNAMEID = dbo_SDB_SESSION.FK_SERVERID
WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-30,Now())))
GROUP BY dbo_LU_SERVERNAME.SERVERNAME
ORDER BY Count(*) DESC;

UNION ALL SELECT "Other" AS SERVERNAME, Count(*) AS SessionNumbers
FROM  (dbo_LU_SERVERNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_SERVERNAME.PK_SERVERNAMEID = dbo_SDB_SESSION.FK_SERVERID)
LEFT JOIN (SELECT TOP 10 dbo_LU_SERVERNAME.SERVERNAME, Count(*) AS SessionNos 
           FROM dbo_LU_SERVERNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_SERVERNAME.PK_SERVERNAMEID = dbo_SDB_SESSION.FK_SERVERID
           WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-31,Now())))
           GROUP BY dbo_LU_SERVERNAME.SERVERNAME
           ORDER BY Count(*) DESC) AS a  ON dbo_LU_SERVERNAME.SERVERNAME = a.SERVERNAME

WHERE a.SERVERNAME Is Null
GROUP BY "Other";

感谢您的 cmets,我之前确实问过另一个问题,几乎与此相同,但另一个问题是关于两个相关实体,这是三个相关实体。

再次感谢

干杯:)

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2016-07-04
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-03-14
    相关资源
    最近更新 更多