После просмотра ваших комментариев кажется, что вам нужно row_number()
with cte as
(
SELECT *,row_number() over(partition by date order by amount desc)rn
from payment t1
) select * from cte where cte.rn=1
CREATE TABLE university
(
id smallint NOT NULL,
name text,
public smallint,
CONSTRAINT university_pk PRIMARY KEY (id)
);
CREATE TABLE person
(
id smallint NOT NULL,
university smallint,
-- more columns here...
CONSTRAINT person_pk PRIMARY KEY (id),
CONSTRAINT person_university_fk FOREIGN KEY (university)
REFERENCES university (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
общественность установлена на 1 для Uni в системе, и 0 для user-entered-unis.
Вы могли обмануть: если Вы не волнуетесь по поводу ссылочной целостности этого поля (т.е. это должно просто там обнаружиться в профиле пользователя и не требуется для строго вынужденных бизнес-правил), сохраните его как простой столбец VARCHAR.
Для Вашего выпадающего используйте запрос как:
SELECT DISTINCT(University) FROM Profiles
Если Вы хотите отфильтровать опечатки или один-offs, попробуйте:
SELECT University FROM PROFILES GROUP BY University HAVING COUNT(University) > 10 -- where 10 is an arbitrary threshold you can tweak
Мы используем этот код в одной из наших баз данных для хранения торговых описаний компаний подрядчика; так как это информационно только (существует отдельное поле "Category" для осуществления бизнес-правил), это - приемлемое решение.
Сохраните флаг для строк вводимым через ввод данных пользователем в ту же таблицу, как у Вас есть свои другие точки данных. Затем можно отсортировать использование флага.
Одним путем это было решено в предыдущей компании, в которой я работал:
Создайте два столбца в своей таблице: 1) nullable идентификатор системной предоставленной строки (сохраненный в отдельной таблице) 2) пользовательская предоставленная строка
Только один из них заполняется. Ограничение может осуществить это (и дополнительно что по крайней мере один из этих столбцов заполняется если соответствующий).
Нужно отметить, что проблема, которую мы решали с этим, была истинный "Другим": ситуация. Это было текстовое описание объекта с некоторыми предварительно установленными значениями по умолчанию. Ваша ситуация походит на фактический объект, который не находится в списке, s.t. больше чем один пользователь мог бы хотеть ввести тот же университет.
Это не проблема проектирования баз данных. Это - проблема UI.
Выпадающий список университетов основан на строках в таблице. Та таблица должна поссориться вставленная, когда пользователь вводит в новом Университете к текстовому полю.
Если Вы хотите разделить список, Вы обеспечили от тех добавленных пользователями, у Вас может быть столбец в таблице University с источником (или происхождение) данных.
Я не уверен, очень ли вопрос ясен здесь.
Я сделал это довольно много раз на работе и просто выбираю между любым выпадающий список текстового поля. Если данные вводятся в текстовое поле затем, я сначала вставляю в базу данных и затем использую ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ для получения уникального идентификатора той вставленной строки для дальнейших запросов.
INSERT INTO MyTable Name VALUES ('myval'); SELECT @@SCOPE_IDENTITY()
Это - против MS SQL 2008, хотя, я не уверен, существует ли @@ SCOPE_IDENTITY () глобальный в других версиях SQL, но я уверен, что существуют эквиваленты.