[不使用TOP的SELECT SSMS的最后一行Hackerrank挑战者

问题描述 投票:0回答:1

这是hackerrank.com上的以下问题:

........................

查询STATION中两个城市的最短和最长CITY名称,以及它们各自的长度(即:名称中的字符数)。如果最小或最大城市超过一个,请按字母顺序选择最先出现的城市。

输入格式

STATION表描述如下:

字段-类型:id-数字,城市-varchar(21),州-varchar(2),lat_n-数字,long_w-数字

其中,LAT_N是北纬,LONG_W是西经。

样本输入

假设CITY只有四个条目:DEF,ABC,PQRS和WXY

样本输出

ABC 3PQRS 4说明

[按字母顺序排列时,CITY名称分别列为ABC,DEF,PQRS和WXY,其长度分别为和。名称最长的城市显然是PQRS,但是名称最短的城市有很多选择。我们选择ABC,因为它按字母顺序排在首位。

注意您可以编写两个单独的查询以获得所需的输出。它不必是单个查询。

...................................................... 。

我想用1个查询解决它,所以我使用了CTE:

    with cte as(
                SELECT  City,
                        LEN (City)     as l,
                        MAX (LEN (City)) over() as x,
                        MIN (LEN (City)) OVER() as m,
 --                       ROW_NUMBER() OVER(ORDER BY LEN(city),city) AS r
                FROM    Station

                )
    SELECT  city,
            l
    FROM    cte
    WHERE   l = x  OR l = m
    --WHERE   l = x  OR r = 1
    ORDER BY L, city;

但是它给出了错误:

您的输出(标准输出)

Amo 3

李3

罗伊3

Marine On Saint Croix 21

因为只意味着有2个城市,一个城市的长度为3,另一个城市的长度为21。所以我这样更改了代码:(请注意Rem'd out代码中的更改)

    with cte as(
                SELECT  City,
                        LEN (City)     as l,
                        MAX (LEN (City)) over() as x,
--                        MIN (LEN (City)) OVER() as m,
                        ROW_NUMBER() OVER(ORDER BY LEN(city),city) AS r
                FROM    Station

                )
    SELECT  city,
            l
    FROM    cte
--    WHERE   l = x  OR l = m
    WHERE   l = x  OR r = 1
    ORDER BY L, city;

这是正确的,输出为:您的输出(标准输出)

Amo 3

Marine On Saint Croix 21

更改代码解决了重复长度3的问题,因为我知道第一行号。但是,如果我在不知道数字是多少的情况下尝试获取最后的行号,就会出现问题。我在SSMS上找到最后一行所见过的所有其他帖子都涉及到使用TOP,但是正如您所看到的,TOP只会检索一行,但是我需要2来回答,因为我想在1个查询中解决2个查询问题。

基本上,我解决了该查询,但是我想知道如果有2个城市的长度为21,那么该怎么办?在这种情况下,我如何找到最后一行?

非常感谢您的时间。

sql sql-server ssms
1个回答
0
投票

您似乎好像在那儿。您想要的逻辑是:

WITH cte AS (
      SELECT City,LEN (City) as l,
             ROW_NUMBER() OVER (ORDER BY LEN(city), city) AS seqnum_min,
             ROW_NUMBER() OVER (ORDER BY LEN(city) DESC, city) AS seqnum_max
      FROM Station
     )
SELECT city, l
FROM cte
WHERE 1 IN (seqnum_min, seqnum_max)
ORDER BY L, city;
© www.soinside.com 2019 - 2024. All rights reserved.