SQL Server 2008: 상위 10개 제품 및 차별화된 기능 제공
제목에서 알 수 있듯이 SQL Server 2008을 사용하고 있습니다.이 질문이 매우 기본적인 질문이라면 죄송합니다.SQL을 사용한 지 며칠 되지 않았습니다.지금 저는 다음과 같은 질문이 있습니다.
SELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
from dm.labs pl
join mas_data.patients p
on pl.id = p.id
where pl.nm like '%LDL%'
and val is not null
제가 하고 싶은 것은 id 열에 있는 고유한 값과 함께 top n을 선택하는 것입니다.일부 포럼을 검색하면 을 사용하도록 표시됩니다.
SELECT DISTINCT TOP 10 ...
하지만 첫 번째 줄을 바꿀 때는
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
저는 구별되는 단어가 없는 것과 같은 결과를 얻습니다.중복된 ID 항목만 필터링하려면 어떻게 해야 합니까?
감사해요.
해라
SELECT TOP 10 distinct MyId FROM sometable;
select top 10 p.id from(select distinct p.id from tablename)tablename
쉬운 옵션은 그룹화 기준을 사용하고 다른 모든 필드에 대해 최소/최대를 선택하는 것입니다.
SELECT TOP 10
p.id,
max(pl.nm),
max(pl.val),
max(pl.txt_val)
from
dm.labs pl
join
mas_data.patients p
on
pl.id = p.id
where
pl.nm like '%LDL%'
and
val is not null
group by
p.id
이것은 넓은 테이블에 대해 꽤 지루할 수 있으므로 다른 옵션은 랭크 오버와 파티션을 사용하는 것입니다.
SELECT TOP 10
p.id,
pl.nm,
pl.val,
pl.txt_val,
rank() over(partition by p.id order by p.id) as Rank
from
dm.labs pl
join
mas_data.patients p
on
pl.id = p.id
where
pl.nm like '%LDL%'
and
val is not null
and
Rank = 1
몇 가지 아이디어:
- 선택 문에 꽤 많은 필드가 있습니다.값이 다른 값과 다를 경우 해당 행이 구별됩니다.
- TOP 절은 일반적으로 WHERE 절과 쌍을 이룹니다.그렇지 않으면 TOP은 큰 의미가 없습니다.무엇보다?"무엇의 맨 위"를 지정하는 방법은 WHERE를 사용하여 정렬하는 것입니다.
- TOP과 DISTINCT 및 WHERE를 사용하더라도 동일한 결과를 얻을 수 있습니다.쿼리하는 데이터가 실제로 원하는 방식으로 필터링되고 정렬될 수 있는지 확인합니다.
다음과 같은 방법을 사용해 보십시오.
SELECT DISTINCT TOP 10 p.id, pl.nm -- , pl.val, pl.txt_val
FROM dm.labs pl
JOIN mas_data.patients p
on pl.id = p.id
where pl.nm like '%LDL%'
and val is not null
ORDER BY pl.nm
결과 집합과 DISTINCT 로직을 제한하기 위해 SELECT 중 일부를 설명했습니다.
select top 10 * from
(
select distinct p.id, ....
)
효과가 있을 것입니다.
저는 이 스레드가 오래된 것을 알지만, 제가 방금 이 같은 문제에 부딪혔기 때문에 생각해 낸 것을 포기하기로 했습니다.효율적이지 않을 수도 있지만, 저는 그것이 일을 해낼 것이라고 믿습니다.
SELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
INTO #yourTempTable
from dm.labs pl
join mas_data.patients p on pl.id = p.id
where pl.nm like '%LDL%' and val is not null
select p.id, pl.nm, pl.val, pl.txt_val
from #yourTempTable
where id IN (select distinct id from #yourTempTable)
음 예상하지 못했을텐데 할림이가 어떤 테이블에서 뚜렷한 TOP10 마이아이드를 선택합니다.
기능적으로 Vaishnavi Kumar가 선택한 상위 10개의 p.id (테이블 이름에서 고유한 p.id 선택) 테이블 이름과 동일합니다.
create table #names ([name] varchar(10))
insert into #names ([name]) values ('jim')
insert into #names ([name]) values ('jim')
insert into #names ([name]) values ('bob')
insert into #names ([name]) values ('mary')
insert into #names ([name]) values ('bob')
insert into #names ([name]) values ('mary')
insert into #names ([name]) values ('john')
insert into #names ([name]) values ('mark')
insert into #names ([name]) values ('matthew')
insert into #names ([name]) values ('luke')
insert into #names ([name]) values ('peter')
select distinct top 5 [name] from #names
select top 5 * from (select distinct [name] from #names) subquery
drop table #names
두 선택 항목 모두에 대해 동일한 결과를 생성합니다.
name
1 bob
2 jim
3 john
4 luke
5 mark
상위 5개 구별 항목을 선택하는 것이 유효하지 않은 것은 이상하지만, 상위 5개 항목을 선택하면 작업할 수 있는 상위 5개 항목을 선택하면 작업할 수 있습니다.
DISTINCT
선택한 모든 값이 같은 경우 행을 제거합니다.보아하니, 당신은 같은 항목을 가지고 있습니다.p.id
다른 하만다것함께과지 른▁different께함▁but.pl.nm
(또는)pl.val
또는pl.txt_val
당신의 질문에 대한 대답은 당신이 당신과 함께 하나의 행에 어떤 값을 보여주고 싶은지에 달려있습니다.p.id
(첫 번째?가장 작은? 아무 것도?).
제 생각에 문제는 각 p.id 에 대해 하나의 결과를 원하는 것입니까?
하지만 일부 p.id 에 대해 "이상적인" 결과를 얻고 있습니다. 맞나요?
DISTINCT 키워드는 전체 결과 집합에 적용되므로 p.id 뿐만 아니라 pl.nm, pl.val, pl.txt_val에도 적용됩니다.
당신은 그런 것이 필요합니다.
SELECT TOP 10 p.id, max( p1.nm ), max (p1.val), ...
FROM ...
GROUP BY p.id
그러면 고유 키워드가 필요하지 않습니다.
공통 테이블 식을 사용하여 상위 10개의 고유 ID를 얻은 다음 나머지 데이터에 결합할 수 있습니다.
;WITH TopTenIDs AS
(
SELECT DISTINCT TOP 10 id
FROM dm.labs
ORDER BY ......
)
SELECT
tti.id, pl.nm, pl.val, pl.txt_val
FROM
TopTenIDs tti
INNER JOIN
dm.labs pl ON pl.id = tti.id
INNER JOIN
mas_data.patients p ON pl.id = p.id
WHERE
pl.nm like '%LDL%'
AND val IS NOT NULL
그러면 되겠군요.주의: "TOP x" 절이 있는 경우 일반적으로 ORDER BY 절도 필요합니다. TOP 10을 사용하려면 시스템에 "TOP"이 어떤 순서인지 알려주어야 합니다.
PS: "환자" 테이블에서 어떤 필드도 선택하지 않는다면, 왜 "환자" 테이블에 참여합니까?
SELECT TOP 14 A, B, C
FROM MyDatabase
Where EXISTS
(
Select Distinct[A] FROM MyDatabase
)
이것이 정답이며 표에서 3개의 높이 값을 찾을 수 있습니다.
SELECT TOP(1) T.id FROM (SELECT DISTINCT TOP(3) st.id FROM Table1 AS t1 , Table2 AS t2 WHERE t1.id=t2.id ORDER BY (t2.id) DESC ) T ORDER BY(T.id) ASC
SELECT DISTINCT * FROM (
SELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
from dm.labs pl
join mas_data.patients p
on pl.id = p.id
where pl.nm like '%LDL%'
and val is not null
)
언급URL : https://stackoverflow.com/questions/1925176/sql-server-2008-top-10-and-distinct-together
'programing' 카테고리의 다른 글
Amazon MWS - 계산된 요청 서명이 제공된 서명과 일치하지 않습니다. (0) | 2023.07.17 |
---|---|
iOS 응용 프로그램의 최대 크기 (0) | 2023.07.17 |
MongoDB: 큰 파일을 가져올 때 mongoimport의 연결이 끊어집니다. (0) | 2023.06.27 |
webpack://와 webpack-internal://의 차이점은 무엇입니까? (0) | 2023.06.27 |
파일 크기를 바이트 단위로 반환하는 VBA Excel 기능 (0) | 2023.06.27 |