T-SQL: Сортировка по дате, затем группировка?

Vincent Robert прав в своем комментарии , Как Вы правильно используете пространства имен в C++? .

Используя Пространства имен пространства имен

используются по крайней мере, чтобы помочь избежать коллизии имени. В Java это осуществляется через "org.domain" идиому (потому что предполагается, что каждый не будет использовать ничто больше, чем его собственное доменное имя).

В C++, Вы могли дать пространство имен всему коду в Вашем модуле. Например, для модуля MyModule.dll, Вы могли дать его коду пространство имен MyModule. Я имею, посмотрите в другом месте кого-то использование MyCompany:: MyProject:: MyModule. Я предполагаю, что это - излишество, но в целом, это кажется корректным мне.

Используя "использование"

Используя должен использоваться с большой осторожностью, потому что это эффективно импортирует один (или все) символы от пространства имен в Ваше текущее пространство имен.

Это является злым, чтобы сделать это в заголовочном файле, потому что Ваш заголовок загрязнит каждый источник включая его (это напоминает мне о макросах...), и даже в исходном файле, плохо разработайте вне функционального объема, потому что это импортирует в глобальной области видимости символы от пространства имен.

самый безопасный способ использовать "использование" состоит в том, чтобы импортировать избранные символы:

void doSomething()
{
   using std::string ; // string is now "imported", at least,
                       // until the end of the function
   string a("Hello World!") ;
   std::cout << a << std::endl ;
}

void doSomethingElse()
{
   using namespace std ; // everything from std is now "imported", at least,
                       // until the end of the function
   string a("Hello World!") ;
   cout << a << endl ;
}

Вы будете видеть большое "использование станд. пространства имен"; в учебном руководстве или примерах кода. Причина состоит в том, чтобы сократить количество символов для создания чтения легче, не потому что это - хорошая идея.

"станд. пространства имен использования"; препятствуется Scott Meyers (я не помню точно, какую книгу, но я могу найти им при необходимости).

Пространства имен Состава

Пространства имен являются больше, чем пакеты. Другой пример может быть найден в Bjarne Stroustrup "Язык Программирования на C++".

В "Специальном выпуске", по телефону 8.2.8 Состав Пространства имен, он описывает, как можно объединить два пространства имен AAA и BBB в другой названный CCC. Таким образом CCC становится псевдонимом и для AAA и для BBB:

namespace AAA
{
   void doSomething() ;
}

namespace BBB
{
   void doSomethingElse() ;
}

namespace CCC
{
   using namespace AAA ;
   using namespace BBB ;
}

void doSomethingAgain()
{
   CCC::doSomething() ;
   CCC::doSomethingElse() ;
}

Вы могли даже импортировать избранные символы из различных пространств имен, для создания собственного интерфейса пространства имен. Я должен все же найти практическое применение этого, но в теории, это прохладно.

5
задан eKek0 7 November 2009 в 19:25
поделиться

5 ответов

В SQL Server 2005 или новее может выглядеть так:

select 
  * 
from
  (select *,max(start_date) over(partition by city) max_date from tablename) alias
order by max_date desc, start_date desc
7
ответ дан 18 December 2019 в 11:58
поделиться

Присоедините запрос к самому себе и сгруппируйте по названию города. Затем вы можете использовать максимальную дату начала для города в предложении ORDER BY.

select c1.*
from cities c1
left join cities c2 on c1.city = c2.city
group by c1.id, c1.name, c1.salary, c1.start_date, c1.city, c1.region
order by max(c2.start_date) desc, c1.city, c1.start_date desc
2
ответ дан 18 December 2019 в 11:58
поделиться

Вопрос не ясен ... но это приведет к появлению указанной вами таблицы:

select *
from MyTable p
order by 
    (SELECT MAX(start_date) AS max_city_date FROM MyTable WHERE city=p.city) desc, 
    city, 
    start_date desc

Это то, что вы хотите ?? Если можете, дайте мне еще несколько указателей.

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ----------
9           Mary       60020       2002-06-09 00:00:00.000 Toronto    W
6           James      70060       1999-09-06 00:00:00.000 Toronto    N
3           Celia      24020       1996-12-03 00:00:00.000 Toronto    W
8           Chris      26020       2001-07-08 00:00:00.000 Vancouver  N
5           David      80026       1998-10-05 00:00:00.000 Vancouver  W
2           Robert     14420       1995-01-02 00:00:00.000 Vancouver  N
7           Alison     90620       2000-08-07 00:00:00.000 NewYork    W
4           Linda      40620       1997-11-04 00:00:00.000 NewYork    N
1           Jason      40420       1994-02-01 00:00:00.000 NewYork    W
2
ответ дан 18 December 2019 в 11:58
поделиться

Попробуйте следующее:

SELECT * 
FROM
    (
    SELECT 
        *,
        (SELECT MAX(start_date) FROM cities c2 WHERE c1.city = c2.city) AS latest_start_date
    FROM cities c1
    )
ORDER BY latest_start_date DESC, start_date DESC

Внутренний запрос выдаст вам что-то вроде этого:

ID          name       salary      start_date              city       region lastest_start_date
----------- ---------- ----------- ----------------------- ---------- ------ -------------------
          1 Jason            40420 1994-02-01 00:00:00.000 New York   W      2000-08-07 00:00:00.000
          2 Robert           14420 1995-01-02 00:00:00.000 Vancouver  N      2001-07-08 00:00:00.000
          3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W      2002-06-09 00:00:00.000
          4 Linda            40620 1997-11-04 00:00:00.000 New York   N      2000-08-07 00:00:00.000
          5 David            80026 1998-10-05 00:00:00.000 Vancouver  W      2001-07-08 00:00:00.000
          6 James            70060 1999-09-06 00:00:00.000 Toronto    N      2002-06-09 00:00:00.000
          7 Alison           90620 2000-08-07 00:00:00.000 New York   W      2000-08-07 00:00:00.000
          8 Chris            26020 2001-07-08 00:00:00.000 Vancouver  N      2001-07-08 00:00:00.000
          9 Mary             60020 2002-06-09 00:00:00.000 Toronto    W      2002-06-09 00:00:00.000
1
ответ дан 18 December 2019 в 11:58
поделиться
SELECT yourTable.*
  FROM yourTable INNER JOIN
      (SELECT city, MAX(start_date) AS max_city_date 
         FROM yourTable 
        GROUP BY city) max_dates
      ON yourTable.city = max_dates.city
ORDER BY max_dates.max_city_date DESC, yourTable.city, yourTable.start_date DESC

yourTable.city в предложении ORDER BY обеспечивает согласованную группировку по городам, если два города имеют одинаковую max_city_date.

3
ответ дан 18 December 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: