【问题标题】:Select row with latest date from a multi join从多连接中选择具有最新日期的行
【发布时间】:2018-04-26 01:30:31
【问题描述】:

我无法从多连接语句中获取具有最新日期的 1 行。

涉及 3 个表:

(单位)

SN                |            DateTime |
------------------|---------------------|
123               |2018-03-10 15:23:32  |
456               |2018-03-10 15:40:15  |
789               |2018-03-10 15:53:58  |

(历史)

ID     |SN                |
-------|------------------|
84     |123               |
85     |456               |
86     |789               |

(链接)

SN                |      ID |
------------------|---------|
123               |84       |
456               |85       |
789               |86       |

(车站)

ID     |Type            |      datetime      |location                 |
-------|----------------|--------------------|-------------------------|
84     |ALPHA           |2017-08-21 16:54:23 |X                        |
84     |BRAVO           |2017-08-21 16:56:08 |X1                       |
277    |DELTA           |2017-08-21 17:46:11 |Y                        |

目标

获取一个联接表,该表将仅显示每行具有最近日期时间并选择类型的那些行。

我已经成功地连接了表格,甚至对日期时间进行了排序,以便最近的日期始终是前 1 个,但我不知道如何选择我感兴趣的前 1 个。

我已经在这几天了,不能只得到我需要的一排。我总是以重复项结束,例如(站)ID 84。

我之前尝试过的

SELECT rs.Unit, max(rf2.Type) as mydate,  rf2.Type, rf2.ID
FROM DB.dbo.Unit rs 
INNER JOIN DB.dbo.Link rf ON ( rs.ID = rf.ID  )  
INNER JOIN DB.dbo.History rf1 ON ( rf.SN = rf1.SN)  
INNER JOIN DB.dbo.Station rf2 ON ( rf1.ID = rf2.ID )         
where rf2.Type like 'AL%'
GROUP BY rs.SN, rf2.DateTime, rf2.Type, rf2.ID
order by rs.SN, rf2.DateTime desc;

我也尝试了 CTE,但同样的问题:我不知道如何只保留最近的行。

以上结果

SN                |mydate               |Type         |ID     |
------------------|---------------------|-------------|-------|
666               |2017-09-23 15:15:58  |Alpha        |189    |
777               |2017-09-01 16:13:16  |Alpha7       |138    |
*123*             |*2017-11-03 09:17:51*|*Alpha1*     |*84*   |
123               |2017-11-01 03:08:09  |Alpha2       |84     |
123               |2017-11-01 03:07:59  |Alpha3       |84     |

基本上我需要的是一个只保留唯一行的表,例如用星号 (123) 标记的行、最近日期、特定类型,如 'like 'AL%'。

@Ferc 发表评论后,我尝试了这样的操作:

select ts.ID, ts.DateTime, ts.location 
from (select ID, DateTime, location 
row_number() over(partition by ID order by DateTime desc) as rn
from DB.dbo.Station where station like 'AL%') as ts
where rn = 1; 

I got "SQL Error [102] [S0001]: Incorrect syntax near '('.
Incorrect syntax near '('.
Incorrect syntax near '('." 
as an (complete rubbish) error message.

然后我在 location 后面加上一个 ',' 并得到了结果。

我会尝试将其纳入我的 CTE。

【问题讨论】:

  • 您可以使用ROW_NUMBER,而不是group by。见here
  • 您能否向我们展示您对样本数据的预期结果?因为上述结果与您的样本数据不匹配。History 和 Link 表有什么不同?跨度>
  • @Ferc:感谢您的链接。我以前见过这样的东西,但从来没有让它起作用。用我尝试的方法更新了问题。我只在附近得到一个错误:'('。不管那应该是什么意思......
  • @Just_Stacking 好的...好吧,也许您在某个地方遇到了语法错误。 IT WeiHan 似乎语法正确,但我认为对于您的情况,您需要按[Type][SN] 进行分区,而不是日期字段。
  • @Ferc:是的,正确的。我设法弄清楚了这一点。谢谢!当我用我的真实表名更改虚拟名称时,IT WeiHan 的答案似乎很有效。从其他表中获取所有其他字段似乎也可以正常工作,因此我最终得到了一张大而快乐的表。我想我会保留这个作为答案,因为它是最快到达的。

标签: sql sql-server


【解决方案1】:
select * from (
    select 
    row_number() over(partition by rf2.[datetime] order by rf2.[datetime] desc) as rn 
    ,rf2.*
    FROM Unit rs 
    INNER JOIN Link rf ON ( rs.SN = rf.SN  )  
    INNER JOIN History rf1 ON ( rf.SN = rf1.SN)  
    INNER JOIN Station rf2 ON ( rf1.ID = rf2.ID )  
    where rf2.Type like 'AL%'
) T
where rn = 1;


SQL Fiddle Example Link

【讨论】:

  • 感谢您提供小提琴!我不知道他们现在也有这方面的服务,只知道 .NET 服务。得到的比我想要的多! :]
  • 这是我的荣幸
【解决方案2】:

如果我理解正确,你可能会这样做。

您需要使用ROW_NUMBEROVER(partition by rf2.ID,rs.SN order by rf2.[datetime] desc) 编写子查询,您将获得rf2.IDrs.SN 上的组号。

然后得到RowNumber = 1 行,这意味着最新的日期。

SELECT t.SN,t.[datetime],t.Type,t.ID
FROM(
  SELECT rs.SN,
         rf2.[datetime],
         rf2.[Type],
         rf2.ID,
         ROW_NUMBER() OVER(partition by rf2.ID,rs.SN order by rf2.[datetime] desc) rn
  FROM Unit rs 
  INNER JOIN Link rf ON ( rs.SN = rf.SN  )  
  INNER JOIN History rf1 ON ( rf.SN = rf1.SN)  
  INNER JOIN Station rf2 ON ( rf1.ID = rf2.ID )         
  WHERE rf2.Type like 'AL%'
) t 
where t.rn = 1

sqlfiddle:http://sqlfiddle.com/#!18/36061/2

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2021-11-09
    • 2015-06-21
    • 2019-01-23
    相关资源
    最近更新 更多