2016-08-24 10 views
6

Zapytanie: Zapytanie dwóch miast w stacji z najkrótszych i najdłuższych nazw miasta, jak również ich długości (tj .: liczba znaków w nazwie). Jeśli jest więcej niż jedno najmniejsze lub największe miasto, wybierz tę, która jest pierwsza, gdy jest uporządkowana alfabetycznie.zapytania oba miasta w stacji z najkrótszych i najdłuższych nazw miasta,

próbki wejściowe:

Załóżmy, że miasto ma tylko cztery pozycje: wyjście DEF, ABC, PQRS and WXY

próbki:

ABC 3 
PQRS 4 
+4

to wygląda na pytanie ćwiczeń. pokaż, co próbujesz rozwiązać. –

+1

Tak, zgadzam się z vkp co próbujesz? Podpowiedź, że nie potrzebujesz zagnieżdżonych lub zagregowanych funkcji, więc ja je rozszyfrowaliśmy. Długość() to funkcja, która daje długość miasto – Matt

+0

(Wybierz miasto, długość (miasta) od stacji zamówienie długości (Miasto) asc granicznej 1 ) unia wszystko (wybierz miasto, długość (miasto) od stacji rzędu od długości (miasta) desc dopuszczalnej 1 ); –

Odpowiedz

0

spróbować tego przy użyciu UNION:

SELECT MIN(city), LENGTH(city) 
FROM Station 
WHERE LENGTH(city) = 
(SELECT MIN(LENGTH(city)) 
FROM Station) 
UNION 
SELECT MIN(city), LENGTH(city) 
FROM Station 
WHERE LENGTH(city) = 
(SELECT MAX(LENGTH(city)) 
FROM Station) 

Oczywiście moje założenie jest takie, że nazwa twojego stołu to Statio n, a nazwa kolumny to Miasto. Zobacz odpowiadającego postu poniżej około tylko wybierając pierwszy rekord alfabetycznie:

Return only the first alphabetical result of SELECT

1

Oto kolejny sposób to zrobić przy użyciu zawsze pod ręką row_number analityczną funkcję:

with cte as (
    select city, 
     length(city) as len, 
     row_number() over (order by length(city), city) as smallest_rn, 
     row_number() over (order by length(city) desc, city) as largest_rn 
    from station 
) 
select city, len 
    from cte 
where smallest_rn = 1 
union all 
select city, len 
    from cte 
where largest_rn = 1 
1
select min(city), len 
    from (
     select city, length(city) len, 
       max(length(city)) over() maxlen, 
       min(length(city)) over() minlen 
      from station 
     ) 
where len in(minlen,maxlen) 
group by len 

Podkwerenda Pobiera lista miast i jego długość. Jednocześnie "window functions"min/max over() uzyskać minimalną i maksymalną długość dla wszystkich wierszy w zestawie (tabela). Główny filtr kwerendy tylko miasta o długości to min/max. min(city) z grupą przez len podaje wynik imię w kolejności alfabetycznej.

+0

Proszę podać wyjaśnienie swoim kodem, aby OP mógł się z niego uczyć. – EBH

+1

@EBH Ok. zaktualizowany. Nie mówię po angielsku. Proszę poprawić moją odpowiedź, jeśli zawiera błędy gramatyczne. – Mike

2

dla MS SQL Server:

Declare @Small int 
Declare @Large int 
select @Small = Min(Len(City)) from Station 
select @Large = Max(Len(City)) from Station 
select Top 1 City as SmallestCityName,Len(City) as Minimumlength from Station where Len(City) = @Small Order by City Asc 
select Top 1 City as LargestCityName,Len(City) as MaximumLength from Station where Len(City) = @Large Order by City Asc 

dla serwera Oracle:

select * from(select distinct city,length(city) from station order by length(city) asc,city asc) where rownum=1 union 
select * from(select distinct city,length(city) from station order by length(city) desc,city desc) where rownum=1; 
3

Spróbuj tego :)

kod mysql .... prosta

select CITY,LENGTH(CITY) from STATION order by Length(CITY) asc, CITY limit 1; 
select CITY,LENGTH(CITY) from STATION order by Length(CITY) desc, CITY limit 1; 
+0

@Moudiz W rzeczywistości jest to odpowiedź, po prostu nie używał formatowania kodu - redagowałem, aby to naprawić. – EJoshuaS

3
(select CITY, 
     char_length(CITY) as len_city 
    from STATION 
    where char_length(CITY)=(select char_length(CITY) 
          from STATION 
          order by char_length(CITY) LIMIT 1) 
    Order by CITY LIMIT 1) 
UNION ALL 
(select CITY, 
     char_length(CITY) as len_city 
    from STATION 
    where char_length(CITY)=(select char_length(CITY) 
          from STATION 
          order by char_length(CITY) DESC LIMIT 1) 
    Order by CITY DESC LIMIT 1) 
    ORDER BY char_length(CITY); 
+3

Proszę podać wyjaśnienie, dlaczego odpowiada na pytanie – CallumDA

+2

Witamy w Stack Overflow! Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – Carpetsmoker

+0

@Carpetsmoker doda objaśnienia za każdym razem, gdy opublikuję odpowiedź. –

1
SELECT TOP 1 CITY,LEN(CITY) from STATION 
    Where LEN(CITY)=(Select min(len(CITY)) from STATION) order by CITY 
SELECT TOP 1 CITY,LEN(CITY) from STATION 
    Where LEN(CITY)=(Select MAX(len(CITY)) from STATION) 
+3

Witamy w Stack Overflow! Poświęć chwilę na przeczytanie [How to Answer] (http://stackoverflow.com/questions/how-to-answer) - wygląda to na przydatne, ale przydałoby się wyjaśnienie, co robi kod, rozważ [edytuj] (http://stackoverflow.com/posts/41385887/edit)-ing that in? –