Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从带有最新日期戳的联接中获取记录集?_Sql_Sql Server - Fatal编程技术网

Sql 如何从带有最新日期戳的联接中获取记录集?

Sql 如何从带有最新日期戳的联接中获取记录集?,sql,sql-server,Sql,Sql Server,我正在编写一个存储过程,从3个表中获取一些数据。现在,我的输出如下所示: SELECT robinson_Rigs.rigId , robinson_Rigs.rigName , robinson_Clients.companyName , robinson_Wells.wellName , robinson_Wells.county , max(robinson_Wells.startDate) , robinson_Wells.di

我正在编写一个存储过程,从3个表中获取一些数据。现在,我的输出如下所示:

SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , max(robinson_Wells.startDate)
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
group by robinson_Rigs.rigId
ORDER BY robinson_Rigs.rigId
SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , robinson_Wells.startDate
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN
    (
        SELECT rigId
            , MAX(startDate) AS MostRecentDate
        FROM robinson_rigs
        GROUP BY rigId
    ) latestRigDate ON robinson_Rigs.RigId = latestRigDate.RigId
        AND robinson_rigs.StartDate = latestRigDate.MostRecentDate
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
ORDER BY robinson_Rigs.rigId

钻机20列出两次。我只想抓取带有最新邮戳的唱片。因此,我的查询现在如下所示:

SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , max(robinson_Wells.startDate)
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
group by robinson_Rigs.rigId
ORDER BY robinson_Rigs.rigId
SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , robinson_Wells.startDate
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN
    (
        SELECT rigId
            , MAX(startDate) AS MostRecentDate
        FROM robinson_rigs
        GROUP BY rigId
    ) latestRigDate ON robinson_Rigs.RigId = latestRigDate.RigId
        AND robinson_rigs.StartDate = latestRigDate.MostRecentDate
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
ORDER BY robinson_Rigs.rigId
但我得到了这个错误:

Msg 8120, Level 16, State 1, Procedure robinson_GetAllDrivingDirections, Line 14
Column 'robinson_Rigs.rigName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我怎样才能做到这一点

SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , max(robinson_Wells.startDate)
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
group by robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
ORDER BY robinson_Rigs.rigId

在聚合之前按所有内容分组。除非您通过简单地对所有内容进行分组来理解group,否则SQL不会起到很好的作用,但如果任何其他字段包含钻机的不同值,则StartDate仍将为钻机返回多行

相反,请尝试以下方法:

SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , max(robinson_Wells.startDate)
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
group by robinson_Rigs.rigId
ORDER BY robinson_Rigs.rigId
SELECT
      robinson_Rigs.rigId
    , robinson_Rigs.rigName
    , robinson_Clients.companyName
    , robinson_Wells.wellName
    , robinson_Wells.county
    , robinson_Wells.startDate
    , robinson_Wells.directions
FROM robinson_Wells
    JOIN robinson_Rigs ON robinson_wells.rigId = robinson_Rigs.rigId
    JOIN
    (
        SELECT rigId
            , MAX(startDate) AS MostRecentDate
        FROM robinson_rigs
        GROUP BY rigId
    ) latestRigDate ON robinson_Rigs.RigId = latestRigDate.RigId
        AND robinson_rigs.StartDate = latestRigDate.MostRecentDate
    JOIN robinson_Clients on robinson_Wells.clientId = robinson_Clients.clientId
ORDER BY robinson_Rigs.rigId

联接子查询将返回所有装备ID及其最大(最近)日期的列表。通过刚性和startDate将其连接到完整的robinson_rigs表将“过滤”该表,以便只返回每个rig的最新日期记录。

这仍将导致为单个rig返回多个记录,因为
startDate
不是值更改的唯一字段。
Group By
子句中任何具有不同值的字段都将导致返回额外的行。我还认为这将返回一个错误,因为“方向”不包括在group by中(至少在示例中,该字段还包含每个日期的不同值,导致为rig 20返回第二行)。