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

您还可以使用分析查询:

SQL Fiddle

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

Results:

| ID |                   ts | rn | rnk |
|----|----------------------|----|-----|
|  1 | 2018-01-01T04:00:00Z |  1 |   1 |
|  2 | 2018-01-01T04:00:00Z |  5 |   1 |