【问题标题】:How to select rows with distinct column value ordered by date?如何选择按日期排序的具有不同列值的行?
【发布时间】:2013-01-17 01:04:00
【问题描述】:

我有这张桌子:

create table #tmp
(
  column1 varchar(3),
  column2 varchar(5),
  column3 datetime,
  column4 int
)

insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10)
insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15)
insert into #tmp values ('AAA', 'SKB', '2013-01-31 00:00:00', 20)
insert into #tmp values ('AAA', 'SKB', '2013-01-15 00:00:00', 5)
insert into #tmp values ('AAA', 'SKC', '2013-02-01 00:00:00', 25)

我想选择具有不同 column2 的行,按 column3 排序。 这是期望的结果:

Col1  Col2   Col3                       Col4
AAA   SKB    2013-01-15 00:00:00.000    5
AAA   SKA    2013-01-31 00:00:00.000    15
AAA   SKC    2013-02-01 00:00:00.000    25

我该怎么做?
我正在使用 MS SQL 2005 和 2008

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

应该这样做

http://sqlfiddle.com/#!3/d3dad/11

select * from
(
select max(column1) as column1, column2 as column2, max(column3) as column3, 
  max(column4) as column4
from #tmp
group by column2
) a
order by column3

【讨论】:

  • 这个查询不起作用。它有很多语法错误并且不完整
  • 抱歉,我错过了 group by 中的其他字段。它现在应该可以工作了
  • 您忘记为子查询添加别名。虽然这不会返回所需的输出
  • 好的,我终于在 sql fiddle 上运行并发布了运行脚本!
【解决方案2】:

这取决于你想要什么。您必须处理其他列。

从准确的数据中得到准确的结果:

select column1, column2, min(column3), min(column4)
from #tmp
group by column1, column2

但是,一般来说,column3 值可能来自与 column4 值不同的记录,并且如 SQL 中所写,如果您有多个 column1 值与相同 column2 值,您将获得多个结果同一列2。

【讨论】:

  • Column1 将始终具有相同的值
【解决方案3】:

试试这个

;with cte as 
(
  select *, 
  row_number() over (partition by column1, column2 
             order by column3) rnk
  from #tmp

) select * from cte where rnk = 1
  order by column3;

SQL DEMO HERE

【讨论】:

  • 如果 col1,col2,col3 值在多行中重复,这将不起作用。最好使用row_number() DEMO 不明显
【解决方案4】:
SELECT t.column1, t.column2, t.column3, t.column4
FROM @tmp t
INNER JOIN (SELECT DISTINCT column2, MIN(column3) [column3] FROM @tmp GROUP BY column2) v
    ON t.column2 = v.column2 AND t.column3 = v.column3
ORDER BY t.column3

这将获得具有最旧column3的唯一column2,并根据column3排序的结果过滤表

【讨论】:

    【解决方案5】:

    我认为row_number() 更好(Sql-Demo)

    select column1, column2, column3, column4 
    from (
      select column1, column2, column3, column4, 
             row_number() over (partition by column2 order by column3) rn
      from #tmp ) A
    where rn=1
    order by column3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多