从 3 个表中选择数据,按最新日期值和另一个值分组

公司

好的,所以我一直在绞尽脑汁,我想是时候问问集体了!

我正在使用 SQLServer,我有 3 个表,定义如下:

VolumeData

__________________________
| dataid | currentReading|
--------------------------
|   1    |      22       |
|   7    |      33       |
|   9    |      25       |
|   12   |      12       |
--------------------------

LatestData

________________________________________________________________
| dataid | unitNumber | unitLocation |      dateTimeStamp      |
----------------------------------------------------------------
|   1    |  2344454   |      2       | 2017-07-10 13:16:29.000 |
|   7    |  2344451   |     44       | 2017-07-10 13:22:29.000 |
|   9    |  2344456   |     92       | 2017-07-10 12:16:29.000 |
|   12   |  2344456   |     12       | 2017-07-10 12:13:23.000 |
----------------------------------------------------------------

unitData

____________________________________________________________________________________
| unitNumber | unitLocation | buildingNumber | officeNumber | officeName | country |
------------------------------------------------------------------------------------
|   2344454  |      2       |       44       |       1      |  Telford   |    UK   |
|   2344451  |     44       |       22       |       1      |  Telford   |    UK   |
|   2344456  |     92       |       12       |       2      |  Hamburg   |    GER  |
|   2344456  |     12       |       33       |       2      |  Hamburg   |    GER  |
------------------------------------------------------------------------------------

我只需要检索最新的 currentReading(基于最新数据中的 dateTimeStamp 字段)以及以下字段,按 unitNumber 分组:

currentReading, unitNumber, officeName, country, buildingNumber

需要注意的另一件事是记录可以按任何顺序到达。

以下是我尝试过的一个示例,我尝试了更多示例,但不幸的是我没有让它们保持打开状态:

SELECT 
      a.currentReading
      ,MAX(b.dateTimeStamp)
      ,c.unitNumber
      ,c.country
      ,c.officeName
  FROM [VolumeData] a INNER JOIN LatestData b ON a.dataid = b.dataid INNER JOIN
    unitData c ON c.[unitNumber] = b.[unitNumber] AND c.[unitLocation] = b.[unitLocation];

这导致: Column 'VolumeData.currentReading' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

任何建议将不胜感激!我尝试的所有方法要么导致检索太多行,要么导致逻辑 SQL 错误。我还应该补充一点,这些表包含数百万行,并且每天都在增长,所以我正在寻找一种非常有效的方法来做到这一点。

谢谢!

帕特尔

Eric的答案相同的逻辑,使用 CTE 可能会更简洁一些并加入较少的记录。

DECLARE @VolumeData TABLE
( 
    dataid          int, 
    currentReading  int
); 

INSERT INTO @VolumeData VALUES(1, 22);
INSERT INTO @VolumeData VALUES(7, 33);
INSERT INTO @VolumeData VALUES(9, 25);
INSERT INTO @VolumeData VALUES(12,12);

DECLARE @LatestData TABLE
( 
    dataid          int, 
    unitNumber      int,
    unitLocation    int,
    dateTimeStamp   datetime
); 

INSERT INTO @LatestData VALUES(1,  2344454, 2,  '2017-07-10 13:16:29.000');
INSERT INTO @LatestData VALUES(7,  2344451, 44, '2017-07-10 13:22:29.000');
INSERT INTO @LatestData VALUES(9,  2344456, 92, '2017-07-10 12:16:29.000');
INSERT INTO @LatestData VALUES(12, 2344456, 12, '2017-07-10 12:13:23.000');

DECLARE @UnitData TABLE
( 
    unitNumber      int,
    unitLocation    int,
    buildingNumber  int,
    officeNumber    int,
    officeName      varchar(50),
    country         varchar(50)
); 

INSERT INTO @UnitData VALUES(2344454, 2,  44, 1, 'Telford', 'UK');
INSERT INTO @UnitData VALUES(2344451, 44, 22, 1, 'Telford', 'UK');
INSERT INTO @UnitData VALUES(2344456, 92, 12, 2, 'Hamburg', 'GER');
INSERT INTO @UnitData VALUES(2344456, 12, 33, 2, 'Hamburg', 'GER');

WITH LatestData_CTE (dataid, unitNumber, unitLocation, dateTimeStamp, rowNum)  
AS  
(  
    SELECT  dataid
          , unitNumber
          , unitLocation
          , dateTimeStamp
          , ROW_NUMBER() OVER (PARTITION BY unitNumber ORDER BY dateTimeStamp DESC) AS rowNum
    FROM @LatestData
)  
SELECT currentReading, l.unitNumber, officeName, country, buildingNumber
 FROM LatestData_CTE l 
    INNER JOIN @VolumeData v ON v.dataid = l.dataid 
    INNER JOIN @UnitData u ON u.[unitNumber] = l.[unitNumber] AND u.[unitLocation] = l.[unitLocation]
WHERE l.rowNum = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在sql中从另一个表的数据中选择3个用户的最佳方法是什么?

来自分类Dev

从每组的3个表中选择具有最新日期的sql行

来自分类Dev

SQL连接3个表,按最新组值分组

来自分类Dev

SQL联接3个表,按最新组值分组

来自分类Dev

如何使用Ruby和SQLite3从数据库中选择一个值?

来自分类Dev

如何使用Ruby和SQLite3从数据库中选择一个值?

来自分类Dev

从3个不同的表中选择3个不同的列(COUNT),然后按日期分组

来自分类Dev

从3列中选择从右到左的最后一个值

来自分类Dev

如何查询总共有一个相同字段的三 (3) 个表并将结果按另一个字段分组?

来自分类Dev

从3个表的链接属性值的2个表中选择数据

来自分类Dev

联接3个表并从一个表中获取最后更新日期

来自分类Dev

在另一个3个值的总和中找到一个数组中的最大值

来自分类Dev

从3个具有空值的表中选择

来自分类Dev

从3个表中选择mysql中的不同值

来自分类Dev

如何从 3 个表 + count() 中选择值

来自分类Dev

在一个表中查找空值和3组数据之间的重复项

来自分类Dev

从3个表中选择和匹配数据

来自分类Dev

将Helm 3中的值映射到另一个值

来自分类Dev

SQL:从不包含来自另一个表的值的表中选择数据

来自分类Dev

如何在另一个列表中返回3个最低值的列表

来自分类Dev

如何在另一个列表中返回3个最低值的列表

来自分类Dev

MySQL从3个表中选择数据

来自分类Dev

按日期获取最新行,但按另一个表中的列分组

来自分类Dev

mysql插入值,并从另一个表中选择数据

来自分类Dev

返回具有 3 个或更多连续值作为 1 的行,按日期排序和按区域分组

来自分类Dev

PHP / MySQL从3个不同的表中选择数据并将结果显示在一个表中

来自分类Dev

从另一个表中选择和拆分列值的 Sql 查询

来自分类Dev

基于 D3 可视化的另一个对象,按特定顺序按值对对象数组进行排序

来自分类Dev

SQL查询基于列值从3个选项中选择并从其他表中选择

Related 相关文章

  1. 1

    在sql中从另一个表的数据中选择3个用户的最佳方法是什么?

  2. 2

    从每组的3个表中选择具有最新日期的sql行

  3. 3

    SQL连接3个表,按最新组值分组

  4. 4

    SQL联接3个表,按最新组值分组

  5. 5

    如何使用Ruby和SQLite3从数据库中选择一个值?

  6. 6

    如何使用Ruby和SQLite3从数据库中选择一个值?

  7. 7

    从3个不同的表中选择3个不同的列(COUNT),然后按日期分组

  8. 8

    从3列中选择从右到左的最后一个值

  9. 9

    如何查询总共有一个相同字段的三 (3) 个表并将结果按另一个字段分组?

  10. 10

    从3个表的链接属性值的2个表中选择数据

  11. 11

    联接3个表并从一个表中获取最后更新日期

  12. 12

    在另一个3个值的总和中找到一个数组中的最大值

  13. 13

    从3个具有空值的表中选择

  14. 14

    从3个表中选择mysql中的不同值

  15. 15

    如何从 3 个表 + count() 中选择值

  16. 16

    在一个表中查找空值和3组数据之间的重复项

  17. 17

    从3个表中选择和匹配数据

  18. 18

    将Helm 3中的值映射到另一个值

  19. 19

    SQL:从不包含来自另一个表的值的表中选择数据

  20. 20

    如何在另一个列表中返回3个最低值的列表

  21. 21

    如何在另一个列表中返回3个最低值的列表

  22. 22

    MySQL从3个表中选择数据

  23. 23

    按日期获取最新行,但按另一个表中的列分组

  24. 24

    mysql插入值,并从另一个表中选择数据

  25. 25

    返回具有 3 个或更多连续值作为 1 的行,按日期排序和按区域分组

  26. 26

    PHP / MySQL从3个不同的表中选择数据并将结果显示在一个表中

  27. 27

    从另一个表中选择和拆分列值的 Sql 查询

  28. 28

    基于 D3 可视化的另一个对象,按特定顺序按值对对象数组进行排序

  29. 29

    SQL查询基于列值从3个选项中选择并从其他表中选择

热门标签

归档