【发布时间】: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