SQL 等同于 Oracle 的 "WHERE () IN"?
SQL Equivalent of Oracle's "WHERE () IN"?
在 Oracle 中,如果我想 select 所有 ID 的最新条目的所有列(基于时间戳列),我可以这样做:
SELECT * FROM TABLE1 WHERE (TIMESTAMP,ID) IN
(SELECT MAX(TIMESTAMP),ID FROM TABLE1 GROUP BY ID)
但此语句在 SQL SMS(版本 17.4)中不起作用。
是否有我可以使用的等效语句?
您需要相关性 方法:
SELECT t.*
FROM TABLE1 t
WHERE TIMESTAMP = (SELECT MAX(t1.TIMESTAMP) FROM TABLE1 t1 WHERE t1.ID = t.ID);
where in 条件可以很容易地替换为内部连接
SELECT * FROM TABLE1
INNER JOIN (
SELECT MAX(TIMESTAMP) max_time,ID FROM TABLE1 GROUP BY ID
) t on t.max_time = TABLE1.TIMESTAMP and t.ID = TABLE1.ID
您还可以使用分析查询:
MS SQL Server 2017 架构设置:
CREATE TABLE Table1 ( ID int, ts DATETIME, rn INT );
INSERT INTO Table1 ( id, ts, rn )
SELECT 1, {ts '2018-01-01 00:00:00'}, 5 UNION ALL
SELECT 1, {ts '2018-01-01 01:00:00'}, 4 UNION ALL
SELECT 1, {ts '2018-01-01 02:00:00'}, 3 UNION ALL
SELECT 1, {ts '2018-01-01 03:00:00'}, 2 UNION ALL
SELECT 1, {ts '2018-01-01 04:00:00'}, 1 UNION ALL
SELECT 2, {ts '2018-01-01 00:00:00'}, 1 UNION ALL
SELECT 2, {ts '2018-01-01 01:00:00'}, 2 UNION ALL
SELECT 2, {ts '2018-01-01 02:00:00'}, 3 UNION ALL
SELECT 2, {ts '2018-01-01 03:00:00'}, 4 UNION ALL
SELECT 2, {ts '2018-01-01 04:00:00'}, 5;
查询 1:
SELECT *
FROM (
SELECT t.*,
RANK() OVER ( PARTITION BY id ORDER BY ts DESC ) AS rnk
FROM TABLE1 t
) t
WHERE rnk = 1
| ID | ts | rn | rnk |
|----|----------------------|----|-----|
| 1 | 2018-01-01T04:00:00Z | 1 | 1 |
| 2 | 2018-01-01T04:00:00Z | 5 | 1 |
在 Oracle 中,如果我想 select 所有 ID 的最新条目的所有列(基于时间戳列),我可以这样做:
SELECT * FROM TABLE1 WHERE (TIMESTAMP,ID) IN
(SELECT MAX(TIMESTAMP),ID FROM TABLE1 GROUP BY ID)
但此语句在 SQL SMS(版本 17.4)中不起作用。
是否有我可以使用的等效语句?
您需要相关性 方法:
SELECT t.*
FROM TABLE1 t
WHERE TIMESTAMP = (SELECT MAX(t1.TIMESTAMP) FROM TABLE1 t1 WHERE t1.ID = t.ID);
where in 条件可以很容易地替换为内部连接
SELECT * FROM TABLE1
INNER JOIN (
SELECT MAX(TIMESTAMP) max_time,ID FROM TABLE1 GROUP BY ID
) t on t.max_time = TABLE1.TIMESTAMP and t.ID = TABLE1.ID
您还可以使用分析查询:
MS SQL Server 2017 架构设置:
CREATE TABLE Table1 ( ID int, ts DATETIME, rn INT );
INSERT INTO Table1 ( id, ts, rn )
SELECT 1, {ts '2018-01-01 00:00:00'}, 5 UNION ALL
SELECT 1, {ts '2018-01-01 01:00:00'}, 4 UNION ALL
SELECT 1, {ts '2018-01-01 02:00:00'}, 3 UNION ALL
SELECT 1, {ts '2018-01-01 03:00:00'}, 2 UNION ALL
SELECT 1, {ts '2018-01-01 04:00:00'}, 1 UNION ALL
SELECT 2, {ts '2018-01-01 00:00:00'}, 1 UNION ALL
SELECT 2, {ts '2018-01-01 01:00:00'}, 2 UNION ALL
SELECT 2, {ts '2018-01-01 02:00:00'}, 3 UNION ALL
SELECT 2, {ts '2018-01-01 03:00:00'}, 4 UNION ALL
SELECT 2, {ts '2018-01-01 04:00:00'}, 5;
查询 1:
SELECT *
FROM (
SELECT t.*,
RANK() OVER ( PARTITION BY id ORDER BY ts DESC ) AS rnk
FROM TABLE1 t
) t
WHERE rnk = 1
| ID | ts | rn | rnk |
|----|----------------------|----|-----|
| 1 | 2018-01-01T04:00:00Z | 1 | 1 |
| 2 | 2018-01-01T04:00:00Z | 5 | 1 |