【问题标题】:How to select the first 30 rows from a set?如何从一组中选择前 30 行?
【发布时间】:2023-02-21 23:05:22
【问题描述】:

我试图从 No_Occupation 表中选择一个列名 MSISDN,然后从结果中选择前 300 行。这是我使用的脚本:

WITH PagingCte AS (
SELECT [Account ID],[User Name],[Last Name],[User Category],
Row_Num = Row_Number() OVER (ORDER BY [User Name])
From AllBalance_20230119)

SELECT [Account ID],[User Name],[Last Name],Row_Num
FROM PagingCte
WHERE [Account ID] IN (SELECT [MSISDN] FROM No_Occupation)
AND Row_Num BETWEEN 1 AND 300;
AND [User Category] = 'Subscriber';

但是在我执行脚本之后,我得到了显示的结果。 我错过了什么?

我试过下面的代码

WITH PagingCte AS (
SELECT [Account ID],[User Name],[Last Name],[User Category],
Row_Num = Row_Number() OVER (ORDER BY [User Name])
From AllBalance_20230119)

SELECT [Account ID],[User Name],[Last Name],Row_Num
FROM PagingCte
WHERE [Account ID] IN (SELECT [MSISDN] FROM No_Occupation)
AND Row_Num BETWEEN 1 AND 300;
AND [User Category] = 'Subscriber';

【问题讨论】:

  • 您使用的是哪个数据库管理系统?
  • 这看起来像 SQL Server,为什么不使用 top 和 order by 呢?
  • 欢迎来到堆栈溢出!每个品牌和版本的数据库服务器都有自己的 SQL 方言。尤其是 SQL Server,提供了一个 TOP (300) 子句。请edit你的问题为你使用的数据库添加tagpostgresqlmysqlsql-serveroraclegoogle-bigqueryamazon-redshift?其他?

标签: sql


【解决方案1】:

为什么需要 CTE?

你可以只 inner join 到 no occupation 来消除不匹配并使用 top 和 order by ...

SELECT TOP 300 [Account ID],[User Name],[Last Name],[User Category]
FROM AllBalance_20230119
INNER JOIN No_Occupation 
 on AllBalance_20230119.[Account ID] = No_Occupation.[MSISDN]
WHERE [User Category = 'Subscriber'
ORDER BY [User Name]

或使用 exists 因为您没有从 no_occupation 返回数据,您只需要知道集合中存在帐户 ID 即可。

SELECT TOP 300 [Account ID],[User Name],[Last Name],[User Category]
FROM AllBalance_20230119
WHERE [User Category = 'Subscriber'
  and exists (SELECT 1 FROM No_Occupation 
              WHERE AllBalance_20230119.[Account ID] = No_Occupation.[MSISDN])
ORDER BY [User Name]

操作顺序在这里很重要

  • 来自
  • 在哪里
  • 订购方式
  • 选择
  • 顶部

order by 出现在 top 之前,确保您根据用户名获得前 300 名。

【讨论】:

    【解决方案2】:

    对于您的查询,无法保证前 1-300 行中会有 [User Category] ​​= 'Subscriber' 的行。你为什么不简单地使用 TOP(它似乎是 SQL 服务器 - 否则 LIMIT):

    SELECT top(300) [Account ID],[User Name],[Last Name],Row_Number() over (Order by  [User Name]) Row_Num
    FROM AllBalance_20230119
    WHERE [Account ID] IN (SELECT [MSISDN] FROM No_Occupation)
    AND [User Category] = 'Subscriber'
    order by [User Name];
    

    【讨论】:

      【解决方案3】:

      由于您使用的 DBMS,答案发生了变化。 无论如何,您可以使用 LIMIT 关键字从查询结果中选择前 n 行。 LIMIT 适用于许多 DBMS,如 SQL Server、PostgreSQL 等。

      您可以通过这种方式实施 LIMIT:

      SELECT [Account ID],[User Name],[Last Name],[User Category],
      Row_Num = Row_Number() OVER (ORDER BY [User Name])
      From AllBalance_20230119
      ORDER BY Row_Num
      LIMIT 300
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        相关资源
        最近更新 更多