I made this explicitly not optimized view in SQL Server:
SELECT ID, T_ID, SRNB, P_DATETIME,
(SELECT TOP (1) COL_A
FROM dbo.T_DETAIL AS T
WHERE (T_ID = a.T_ID) AND (COL_A IS NOT NULL) AND (P_DATETIME <= a.P_DATETIME)
ORDER BY P_DATETIME DESC) AS COL_A, COL_A_MU,
(SELECT TOP (1) COL_B
FROM dbo.T_DETAIL AS T
WHERE (T_ID = a.T_ID) AND (COL_B IS NOT NULL) AND (P_DATETIME <= a.P_DATETIME)
ORDER BY P_DATETIME DESC) AS COL_B, COL_B_MU,
(SELECT TOP (1) COL_Z
FROM dbo.T_DETAIL AS T
WHERE (T_ID = a.T_ID) AND (COL_Z > 0) AND (P_DATETIME <= a.P_DATETIME)
ORDER BY P_DATETIME DESC) AS COL_Z
FROM dbo.T_DETAIL AS a
The purpose of this view is to retrieve from the T_DETAIL table the last value of NOT NULL (or NOT 0 in some cases).
Example: T_DETAIL
+-----+------+------+----------------+-------+-------+-------+
| ID | T_ID | SRNB | P_DATETIME | COL_A | COL_B | COL_Z |
+-----+------+------+----------------+-------+-------+-------+
| xxx | aaa | aaa | 20131205 20:15 | 5 | NULL | 10 |
| xxx | aaa | aaa | 20131205 20:16 | NULL | 10 | NULL |
| xxx | aaa | aaa | 20131205 20:17 | NULL | 5 | 5 |
| xxx | aaa | aaa | 20131205 20:18 | 5 | NULL | NULL |
| xxx | aaa | aaa | 20131205 20:19 | NULL | NULL | 11 |
| xxx | aaa | aaa | 20131205 20:20 | 7 | NULL | 10 |
+-----+------+------+----------------+-------+-------+-------+
in the view is as follows:
+-----+------+------+----------------+-------+-------+-------+
| ID | T_ID | SRNB | P_DATETIME | COL_A | COL_B | COL_Z |
+-----+------+------+----------------+-------+-------+-------+
| xxx | aaa | aaa | 20131205 20:15 | 5 | NULL | 10 |
| xxx | aaa | aaa | 20131205 20:16 | 5 | 10 | 10 |
| xxx | aaa | aaa | 20131205 20:17 | 5 | 5 | 5 |
| xxx | aaa | aaa | 20131205 20:18 | 5 | 5 | 5 |
| xxx | aaa | aaa | 20131205 20:19 | 5 | 5 | 11 |
| xxx | aaa | aaa | 20131205 20:20 | 7 | 5 | 10 |
+-----+------+------+----------------+-------+-------+-------+
The view works, but very slow. Where should I optimize it? I tried to make this an indexed view, but SQL Server Manager warned me that it was ORDER BYonly used TOP 1to retrieve the most recent value. I think I should start with this, but how? Maybe using MAX()somewhere would be a better choice, but I don't want to add complexity and joke.
? , , ?