I have a time series plc tag data as below with values in ‘1’ or ‘0’
JavaScript
x
15
15
1
| id | tagname | value | datetime |
2
|----|-----------------------------|-------|-------------------------|
3
| 28 | RH.ONCHANGE.PROCESS_CYCLE_4 | 1 | 28-09-2021 17:43:38.767 |
4
| 29 | RH.ONCHANGE.CYCLE_COMPLETE | 0 | 28-09-2021 17:44:39.637 |
5
| 30 | RH.ONCHANGE.PROCESS_CYCLE_4 | 0 | 28-09-2021 17:44:01.723 |
6
| 31 | RH.ONCHANGE.PROCESS_CYCLE_5 | 1 | 28-09-2021 17:44:02.070 |
7
| 32 | RH.ONCHANGE.CYCLE_COMPLETE | 1 | 28-09-2021 17:44:07.637 |
8
| 33 | RH.ONCHANGE.PROCESS_CYCLE_5 | 0 | 28-09-2021 17:44:09.637 |
9
| 34 | RH.ONCHANGE.CYCLE_COMPLETE | 0 | 28-09-2021 17:44:35.513 |
10
| 35 | RH.ONCHANGE.ALL_GUN_HOME | 1 | 28-09-2021 17:44:38.890 |
11
| 36 | RH.ONCHANGE.PROCESS_CYCLE_1 | 1 | 28-09-2021 17:44:38.917 |
12
| 37 | RH.ONCHANGE.ALL_GUN_HOME | 1 | 28-09-2021 17:44:39.110 |
13
| 38 | RH.ONCHANGE.ALL_GUN_HOME | 0 | 28-09-2021 17:46:00.087 |
14
| 39 | RH.ONCHANGE.PROCESS_CYCLE_1 | 0 | 28-09-2021 17:46:01.710 |
15
Using below code I can get the output
JavaScript
1
13
13
1
select tOn.tagname, tOn.datetime StartTime, tOff.datetime EndTime
2
from (
3
select tagname, datetime,
4
ROW_NUMBER() Over(Partition by tagname order by datetime desc) EventID
5
from [a2_al].[dbo].[rbc] where value = 1
6
) tOn
7
LEFT JOIN (
8
select tagname, datetime,
9
ROW_NUMBER() Over(Partition by tagname order by datetime desc) EventID
10
from [a2_al].[dbo].[rbc] where value = 0
11
) tOff
12
on (tOn.tagname = tOff.tagname and tOn.EventID = tOff.EventID)
13
Output
JavaScript
1
10
10
1
| id | tagname | StartTime | EndTime |
2
|----|-----------------------------|-------------------------|-------------------------|
3
| 28 | RH.ONCHANGE.PROCESS_CYCLE_4 | 28-09-2021 17:43:38.767 | 28-09-2021 17:44:01.723 |
4
| 31 | RH.ONCHANGE.CYCLE_COMPLETE | 28-09-2021 17:44:39.637 | 28-09-2021 17:44:07.637 |
5
| 30 | RH.ONCHANGE.PROCESS_CYCLE_5 | 28-09-2021 17:44:02.070 | 28-09-2021 17:44:09.637 |
6
| 33 | RH.ONCHANGE.CYCLE_COMPLETE | 28-09-2021 17:44:35.513 | |
7
| 35 | RH.ONCHANGE.ALL_GUN_HOME | 28-09-2021 17:44:38.890 | 28-09-2021 17:44:39.10 |
8
| 34 | RH.ONCHANGE.PROCESS_CYCLE_1 | 28-09-2021 17:44:38.917 | 28-09-2021 17:46:01.710 |
9
| 36 | RH.ONCHANGE.ALL_GUN_HOME | 28-09-2021 17:46:00.087 | |
10
But my requirement is, I only want to query going back 25 hours, so I add a predicate:
JavaScript
1
2
1
where datetime >= DATEADD(Hour, -25, GETDATE())
2
But this returns the error:
Msg 209 Level 16 State 1
Ambiguous column name ‘datetime’.
Advertisement
Answer
You have two subqueries that both contain a column named datetime
. When you say:
JavaScript
1
2
1
where datetime >= DATEADD(Hour, -25, GETDATE())
2
You need to tell SQL Server which one you mean. So either:
JavaScript
1
2
1
where tOn.datetime >= DATEADD(Hour, -25, GETDATE())
2
… or …
JavaScript
1
2
1
where tOff.datetime >= DATEADD(Hour, -25, GETDATE())
2
I’m going to guess it should be tOn
.