如何在SQL中找到每行的第n个最大值

时间:2017-09-01 13:05:19

标签: sqlite

我已经研究过这个问题并找到了单个查询的答案,你可以使用DESC OFFSET 2找到单个列的第n个值。我要做的是找到每个项目的第n个值一排。例如,我正在使用有关自行车共享数据的数据库。数据库存储每次旅行的持续时间和日期。我试图在数据库中找到每天第3个最长的持续时间。如果我要找到最大持续时间,我将使用以下代码。

public class Link {

    public String bookName;
    public int millionsSold;
    public Link next;

    public Link(String bookName, int millionsSold) {
        this.bookName = bookName;
        this.millionsSold = millionsSold;
    }

    public static void main(String[] args) {
        LinkList theLinkedList = new LinkList();
        theLinkedList.insertFirstLink("Don Quixote",500);
        theLinkedList.insertFirstLink("A Tale of two cities",200);
        theLinkedList.insertFirstLink("The Lord Of The Rings",150);
        theLinkedList.insertFirstLink("Harry Potter",1000);
    }
}

class LinkList {

    public Link firstLink;

    LinkList() {
        firstLink = null;
    }

    public boolean isEmpty() {
        return(firstLink == null);
    }

    public void insertFirstLink(String bookName, int millionsSold) {
        Link newLink = new Link(bookName, millionsSold);
        newLink.next = firstLink;
        firstLink = newLink;
    }

}

我希望输出是这样的。

日期3rd_duration

1/1/2017 334

1/2/2017 587

如果第二个最长持续时间的值对于两次或更多次不同的旅行是相同的,我希望具有最低trip_id的旅行排名第3。

我在SQLite工作。 任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

SQLite和MySQL都没有内置ROW_NUMBER函数,因此请为丑陋的查询做好准备。我们仍然可以按日期分组,但是为了找到最大持续时间,我们可以使用相关的子查询。

SELECT
    DATE(t1.start_date) AS start_date,
    t1.duration
FROM trips t1
WHERE
    (SELECT COUNT(*) FROM trips t2
     WHERE DATE(t2.start_date) = DATE(t1.start_date) AND
           t2.duration <= t1.duration) = 3;

请注意,如果您在给定日期内拥有多个具有相同持续时间的记录,则此方法可能会中断。在这种情况下,您可能会得到多个结果,这两个结果实际上都不是第三个最高持续时间。为了处理这种联系,你应该告诉我们关系的逻辑是什么。

在这里演示:

Rextester