SQLite排序结果差异最小

SQLite排序结果差异最小,sqlite,select,sql-order-by,dense-rank,Sqlite,Select,Sql Order By,Dense Rank,在许多方面,这个问题都是从我的观点出发的。我有一张几乎一模一样的桌子 CREATE TABLE IF NOT EXISTS test ( id INTEGER PRIMARY KEY, a INTEGER NOT NULL, b INTEGER NOT NULL, c INTEGER NOT NULL, d INTEGER NOT NULL, weather INTEGER NOT NULL); 其中我通常会有如下条目 INSERT INTO test (a,b,c,d,weath

在许多方面,这个问题都是从我的观点出发的。我有一张几乎一模一样的桌子

CREATE TABLE IF NOT EXISTS test
(
 id INTEGER PRIMARY KEY,
 a INTEGER NOT NULL,
 b INTEGER NOT NULL,
 c INTEGER NOT NULL,
 d INTEGER NOT NULL,
 weather INTEGER NOT NULL);
其中我通常会有如下条目

INSERT INTO test (a,b,c,d,weather) VALUES(1,2,3,4,30100306);
INSERT INTO test (a,b,c,d,weather) VALUES(1,2,3,4,30140306);
INSERT INTO test (a,b,c,d) VALUES(1,2,5,5,10100306);    
INSERT INTO test (a,b,c,d) VALUES(1,5,5,5,11100306);
INSERT INTO test (a,b,c,d) VALUES(5,5,5,5,21101306);
通常,此表将有多行,其中部分/全部b、c和d值相同,但a和天气值不同。根据我对另一个问题的回答,我当然可以提出

WITH cte AS (SELECT *, DENSE_RANK() OVER (ORDER BY (b=2) + (c=3) + (d=4) DESC) rn FROM test where a = 1) SELECT * FROM cte WHERE rn < 3;

尽管在其他方面相似,但它们代表了相当不同的天气条件——第四个数字是4,而不是0,表示降水强度更高。与cte。。。上面将排名前两行在顶部,这是很好的。但是,如果我希望这一行与即将到来的3010306天气条件的差异最小,该怎么办?我显然希望第二行出现在顶部。再一次,我可以接受with cte返回的原始结果。。。然后根据我在Java中当前的天气状况向下钻取到右边的一行。然而,我再一次发现自己在想,也许有一种在SQL中实现这一点的相当巧妙的方法,这超出了我的技能范围。我非常感谢任何能够告诉我如何/是否只使用SQL就可以做到这一点的人。

您可以根据密集度排名第一,根据天气和天气状况的绝对差异排名第二:

WITH cte AS (
  SELECT *, 
    DENSE_RANK() OVER (ORDER BY (b=2) + (c=3) + (d=4) DESC) rn 
  FROM test 
  WHERE a = 1
) 
SELECT a,b,c,d,weather 
FROM cte 
WHERE rn < 3
ORDER BY rn, ABS(weather - ?);

替换?根据即将到来的天气状况的值。

我已经计算出我需要按ABSweather-订购?但是试图在错误的选举中这样做-我的意思是在cte AS。。。。非常感谢。是的,有一个打字错误。现在更正
WITH cte AS (
  SELECT *, 
    DENSE_RANK() OVER (ORDER BY (b=2) + (c=3) + (d=4) DESC) rn 
  FROM test 
  WHERE a = 1
) 
SELECT a,b,c,d,weather 
FROM cte 
WHERE rn < 3
ORDER BY rn, ABS(weather - ?);