sql - 为 1 个表上的每条记录选择前 1 条记录

标签 sql

我在查询时遇到问题。我需要的结果显示表中具有相同 id 的每条记录的前 1。这是表描述。

people :

id   | name  |
--------------
01   | john  |
02   | alex  |

job :
id   | job       | date start  |
---------------------------------
01   | student   | 1/1/2013    |
01   | employee  | 1/1/2014    |
01   | manager   | 3/18/2014   |
02   | student   | 3/1/2013    |
02   | engineer  | 3/3/2014    |

我需要结果为每个 id 显示 1 行。

这是我的 SQL 查询:
select id,name,job,date_start
from people,job
group by date_start,id,name,job

我从那个查询中得到了错误的结果。我不知道如何只为每个 ID 显示 1 条记录。

这是我想要的结果:

查询结果
id | name | job     | date_start |
----------------------------------
01 | john | manager | 3/18/2014  |    -> max date from id='01'
02 | alex | engineer| 3/3/2014   |    -> max date from id='02'

它按日期排序,并从每个具有最大日期的 id 中仅选择 1 个结果。

我怎样才能做到这一点 ?

最佳答案

试试这个

WITH j AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY id  ORDER BY date_Start DESC) AS RowNumber,
        id, job, date_start
    FROM job
)
select  p.id, p.name, j.job, j.date_start
from    people p
        inner join j
            on p.id = j.id
            and j.RowNumber = 1

如你所求..
  • OVER 就像选择查询中的分组和排序区域,但它仅由 ROW_Number()/RANK()/DENSE_RANK()/NTILE(n) 等函数使用。 see here for more info
  • PARTITION BY 就像有一个组,在我的例子中,我按 id
  • 对行进行了分区或分组
  • ORDER By 就像在选择查询中使用 order by 子句一样

  • ROW_Number() 是 SQL Server 中的一个函数,它生成一个从 1 到 N(直到最后一条记录)的整数值序列,每次 PARTITION BY 区域更改其值时,我们都会重置由 ROW_Number() 函数生成的数字。

    关于sql - 为 1 个表上的每条记录选择前 1 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22470582/

    相关文章:

    sql - 为什么 SQL Server 使用嵌套循环

    sql - 连接同一个表获取某些 ID 的重复行

    sql - 如何处理返回多个值的子查询

    php - Cakephp 中的 UNION 语法

    mysql - 通过用户约束的映射连接两个表

    php - 我如何使这个查询 sql 注入(inject)证明?

    java - SQL - 如何获取 SUM 的百分比

    MySQL错误1215 Cannot add Foreign key constraint - FK in different tables

    java - 如何同时执行不同的SQL语句

    php - 从mysql中随机选择记录