SQL-запрос для получения имени продавца с максимальной датой

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

-1
задан Irf 25 February 2019 в 08:02
поделиться

2 ответа

Из требования я понимаю, что в каждой категории должна быть 1 строка, должно быть указано количество продавцов и указано имя продавца с самой последней датой.

Я подготовил нижеприведенный запрос, который генерирует некоторые примеры данных и предоставляет результат, как я понимаю.

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

. Надеюсь, это поможет, любые вопросы, пожалуйста, дайте мне знаю.

declare @Merchant table (
    MerchantId int,
    Name nvarchar(25),
    Date Date
);

declare @MerchantCategory table (
    MerchantId int,
    CategoryId int
);

declare @Category table (
    CategoryId int,
    Name nvarchar(25)
);

insert into @Merchant (MerchantId, Name, Date)
values
(1, 'Lucy', '2019-01-05'),
(2, 'Dave', '2019-01-30'),
(3, 'Daniel' ,'2019-02-01');

insert into @MerchantCategory (MerchantId, CategoryId)
values
(1, 4),
(1, 5),
(2, 4),
(3, 5);

insert into @Category (CategoryId, Name)
values
(4, 'Cat1'), 
(5, 'Cat2');

select c. Name, max(m.name) as MaxMerchantName, count(distinct mc2.merchantid) as Merchantvol from @Category c
left join @MerchantCategory mc2 on c.CategoryId=mc2.CategoryId
outer apply (select top 1 name, max(date) as date from @Merchant m inner join @MerchantCategory mc on m.MerchantId=mc.MerchantId where c.CategoryId=mc.CategoryId group by Name order by max(date) desc) m
group by c.Name;
0
ответ дан Dwight Reynoldson 25 February 2019 в 08:02
поделиться

Я бы ожидал увидеть ваши усилия ..

, так что я иду против SO принципов @ на данный момент ..

попробуйте это:

select c.Name as category_name, count(*) as Merchant_Count, m.Name as Merchant_Name, max(Date)  from
Merchant m join MerchantCategory mc 
on m.MerchantId = mc.MerchantId
join Category c 
on mc.CategoryId = c.CategoryId
group by c.Name, m.Name
0
ответ дан Irf 25 February 2019 в 08:02
поделиться
Другие вопросы по тегам:

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