если объединить все возможные строки вместе, а затем вычислить row_number, разделить на клиентов и упорядочить по «group», а затем по убыванию last_order_date, то вы можете выбрать все строки = 1, чтобы получить «top 1» для каждого клиента
;WITH CTE_last_order_date AS
(
SELECT max(last_order_date) as 'last_order_date', customer
FROM (
SELECT distinct cust.customer, max(s2.dt_created) AS last_order_date, '2' AS 'group'
FROM customers c1 WITH (NOLOCK)
LEFT JOIN archive_orders s2 WITH (NOLOCK)
ON c1.customer = s2.customer
GROUP BY c1.customer
UNION
SELECT distinct c1.customer, max(sord.dt_created) AS last_order_date, '1' AS 'group'
FROM customers c1 WITH (NOLOCK)
LEFT JOIN orders s1 WITH (NOLOCK)
ON cust.customer = sord.customer
GROUP BY
c1.customer
) AS t
GROUP BY customer
)
, --row_number below is 'per customer' and can be used to make rn=1 the top 1 for each customerid
ROWN AS (SELECT Customer,last_order_date,[group], row_number() OVER(partition by customer order by [group] ASC, sord.dt_created DESC) AS RN)
SELECT * FROM Rown WHERE Rown.rn = 1
toString () полезен каждый раз, когда Вы хотите строковое представление объекта. Естественно это происходит для отладки целей, но может также быть допустимо для вывода результатов операций пользователю.
Например, скажем, у Вас есть Сложный класс, который обрабатывает комплексные числа. Если Вы хотите распечатать их пользователю в формате как 3 + 2i, удобно, если они определяют toString (), поскольку Вы не должны писать формат, каждый раз и вывод будут последовательны. Если Вы когда-нибудь хотите изменить то представление, например, к 3 + 2j, только необходимо коснуться toString () метод в Сложном классе.
Так toString () не для отладки целей также, но хороший способ получить последовательные строковые представления Ваших объектов.
Нет, ключ - то, что Вы, как предполагается, переопределяете реализацию по умолчанию ToString()
сделать это полезным. ToString()
может быть отличный способ произвести значение чего-то назад к UI.
Простой пример был бы то, если у Вас есть класс Имени с тремя строки (Сначала, середина, В последний раз). У Вас может быть a ToString()
метод, который форматирует его для UI: "Наконец, Первая середина", например.
Или класс, который хранит математическую операцию (оценивает Left=2, Right=3, Result=6 и оператор enum=Multiply). Звонить ToString()
добираться "2 * 3 = 6".
Однако, вероятно, более распространено иметь множество различных To<qualifier>String()
методы, как.NET DateTime
класс. (ToShortDateString()
, ToLongDateString()
, ToLongTimeString()
, ...)
Править: Что касается того, почему это базировалось в Object
класс, это просто потому что ToString()
допустимая операция для чего-либо.
Кроме того, строки могут быть хорошим способом упорядочить между типами данных или потребителями данных, потому что он, как (практически) гарантируют, будет parsable и не требует дополнительного кодирования или ухода.
Мое персональное предпочтение - то, что toString () никогда не должен использоваться ни для чего кроме отладки. Если Вы хотите произвести строку для объекта, обеспечьте отдельный метод, который ясно документирует Ваше намерение (getName (), getDescription (), и т.д.). Никогда не полагайтесь на реализацию toString ().
Проблема состоит в том, что многие разработчики видят toString () как строка уровня отладки и ничто не думают об изменении его (скажите, когда новые поля добавлены или удалены). Heck, некоторые автоматизировали toString (), разработчики используют отражение для генерации toString () от полей.
Я нашел, что это предпочтение служило мне хорошо за эти годы.
Все, что я могу сказать, - то, что у меня было повреждение кода, когда я изменил toString своего класса для отображения некоторой дополнительной отладочной информации.
Рассматриваемый код был библиотекой GUI, которая решила использовать значение toString как некоторая внутренняя вещь (это было несколько лет назад... Я забываю то, чем это было точно). Конечный результат состоял в том, что я больше не пользовался той библиотекой.
Я сказал бы что, так как большая группа людей видит toString, как используемый для отладки (независимо от Вашего мнения о том, что это Вы думаете, что это должно использоваться для), что это проблематично для использования значения, возвращенного от него, чтобы сделать что-либо программное (как синтаксический анализ он) или отобразить его пользователю.
Если Вы - 100% в управлении toString методов, затем любой ценой делают то, что Вы хотите.
Так, для ответа на вопрос никакой toString не только полезен для отладки, можно сделать что-либо, что Вы хотите с ним. Однако не удивляйтесь, изменяется ли toString способами, которые делают Вас недовольными.
По моему опыту, toString () имеет мало значения за пределами отладки и входа. Вы не можете зависеть от, он - формат или содержание со временем, таким образом, кроме того, чтобы быть человекочитаемым, не зависьте от него ни для чего кроме самого простого из объектов (таких как типы элементарного объекта). Если существует несколько элементов данных, ожидают, что могут измениться в типе или числе со временем и выводе toString () наряду с ним.
Другая точка я хотел бы сильно сделать. Не называйте другие методы в своем toString (). Ничто худшее, чем проверка переменного содержания на точке останова в отладчике и затем наличия большего количества кода не выполняется из-за вызовов метода в toString ().
Я думаю, что важно указать на людей, которые ответили, что упоминание "toString" замечает, что нижний регистр "t" обычно говорит о Java и людях, которые ответили на упоминание, "ToString" обычно относятся к C#. Конечно, это не относится ко всем ответам.
В моем собственном наблюдении (я использую оба ежедневных), программисты в C# поощряются переопределить "ToString" для отображения полезного текстового представления. Принимая во внимание, что в Java я не вижу это почти как очень. На самом деле я редко вижу это.
- МИРОВОЙ СУДЬЯ
Полезный для
И любая другая строка производится.
На AS3 я должен был преобразовать 2D массив в 1D массив. Самое быстрое (выполненная скорость) и самый легкий (кодирование времени) решение было:
var new1DArray:Array = the2DArray.toString().split(",");
Будьте удивлены, но это на самом деле работает, как предназначено и довольно быстро, также!
Во-первых, toString
метод должен возвратить человекочитаемое текстовое представление объекта.
Эта проблема поднята в Эффективном Java как Объект 10: Всегда переопределение toString
.
Это ссылается на спецификацию API Java для Object.toString
метод:
Результатом должно быть краткое, но информативное представление, которое легко для человека читать.
Кроме отладки, переопределяя toString
метод класса может быть полезным при добавлении объектов в a JList
или a JTable
, который по умолчанию будет использовать toString
метод для отображения объекта как текстовой формы в списке или таблице.
Например, в моем случае, я переопределил toString
метод объектов, которые добавляются к a JList
так, чтобы пользователь смог видеть информацию об объекте в списке через GUI.
Так, существуют действительно случаи где toString
метод полезен для случаев кроме отладки. Ключ должен иметь toString
информация о возврате метода, которая на самом деле полезна для человека для наблюдения, не значение по умолчанию Object.toString
реализация, где ячейка памяти объекта используется для ее текстового представления.
ToString () также называет Платформа.NET неявно при распечатывании любого объекта к строке.
Console.WriteLine("My Object is" + object.ToString());
эквивалентно
Console.WriteLine("My Object is" + object);
потому что ToString () неявно называют.
Я верю, хотя не уверено, что это используется отладчиком для "значения" объекта. Это может быть довольно удобно, хотя ограничено. В большинстве случаев при записи собственному отладчику visualizer был бы лучшей идеей.
Я использую ToString () тонна для форматов даты и времени.
Кроме то, что все остальные уже сказали, переопределив ToString () также полезно при использовании средств управления, которые называют его. Например, ComboBox:
myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.
это не могло бы быть использование "intented", но я использовал его для сериализации данных
storeToHardDrive(studentList.ToString());