从相当大的SQL Server表中删除重复行的最佳方法是什么(即300,000多行)?
当然,由于RowID身份字段的存在,行不会是完美的重复.
MyTable的
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
Run Code Online (Sandbox Code Playgroud) 有一个表messages包含如下所示的数据:
Id   Name   Other_Columns
-------------------------
1    A       A_data_1
2    A       A_data_2
3    A       A_data_3
4    B       B_data_1
5    B       B_data_2
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)
如果我运行查询select * from messages group by name,我会得到如下结果:
1    A       A_data_1
4    B       B_data_1
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)
什么查询将返回以下结果?
3    A       A_data_3
5    B       B_data_2
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)
也就是说,应返回每组中的最后一条记录.
目前,这是我使用的查询:
SELECT
  *
FROM (SELECT
  *
FROM messages
ORDER BY id DESC) AS x
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
但这看起来非常低效.还有其他方法可以达到相同的效果吗?
表:
UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)
我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)
更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.
我有一张桌子,我希望得到每组的最新条目.这是表格:
DocumentStatusLogs 表
|ID| DocumentID | Status | DateCreated |
| 2| 1          | S1     | 7/29/2011   |
| 3| 1          | S2     | 7/30/2011   |
| 6| 1          | S1     | 8/02/2011   |
| 1| 2          | S1     | 7/28/2011   |
| 4| 2          | S2     | 7/30/2011   |
| 5| 2          | S3     | 8/01/2011   |
| 6| 3          | S1     | 8/02/2011   |
Run Code Online (Sandbox Code Playgroud)
该表将按降序分组DocumentID并按DateCreated降序排序.对于每一个DocumentID,我想获得最新状态.
我的首选输出:
| DocumentID | Status | DateCreated …Run Code Online (Sandbox Code Playgroud) 我想运行此查询:
SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*
FROM purchases
WHERE purchases.product_id = 1
ORDER BY purchases.purchased_at DESC
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
PG ::错误:错误:SELECT DISTINCT ON表达式必须与初始ORDER BY表达式匹配
添加address_id为第一个ORDER BY表达式会使错误无效,但我真的不想添加排序address_id.是否可以不通过订购address_id?
我有一个关于pgsql的表,其名称(超过1 mio.行),但我也有很多重复.我选择3个字段:id,name,metadata.
我想用ORDER BY RANDOM()和随机选择它们LIMIT 1000,所以我这样做是为了在我的PHP脚本中保存一些内存.
但是我怎么能这样做,所以它只给我一个名单上没有重复的列表.
例如,[1,"Michael Fox","2003-03-03,34,M,4545"]将返回但不是[2,"Michael Fox","1989-02-23,M,5633"].名称字段是最重要的,每次我选择时都必须在列表中是唯一的,它必须是随机的.
我试过GROUP BY name,然后它希望我在GROUP BY同样或在aggragate函数中有id和元数据,但我不想让它们以某种方式过滤.
任何人都知道如何获取许多列,但只在一列上做一个不同的?
我在PostgreSQL中有这个功能,但我不知道如何返回查询结果:
CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)
  RETURNS SETOF RECORD AS
$$
BEGIN
    SELECT text, count(*), 100 / maxTokens * count(*)
    FROM (
        SELECT text
    FROM token
    WHERE chartype = 'ALPHABETIC'
    LIMIT maxTokens
    ) as tokens
    GROUP BY text
    ORDER BY count DESC
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在PostgreSQL函数中返回查询结果.
我发现返回类型应该是SETOF RECORD,对吗?但是返回命令不对.
这样做的正确方法是什么?
怎么做?
这个问题的前标题是" 在带有子查询的复杂查询中使用等级(@Rank:= @Rank + 1) - 它会起作用吗? "因为我正在寻找使用等级的解决方案,但现在我看到Bill发布的解决方案是好多了.
原始问题:
我正在尝试编写一个查询,该查询将根据定义的顺序从每个组获取最后一条记录:
SET @Rank=0;
select s.*
from (select GroupId, max(Rank) AS MaxRank
      from (select GroupId, @Rank := @Rank + 1 AS Rank 
            from Table
            order by OrderField
            ) as t
      group by GroupId) as t 
  join (
      select *, @Rank := @Rank + 1 AS Rank
      from Table
      order by OrderField
      ) as s 
  on t.GroupId = s.GroupId and t.MaxRank = s.Rank
order by OrderField
Run Code Online (Sandbox Code Playgroud)
表达式@Rank := @Rank + 1 …
举个例子,我想按类别选择带有最大日期组的id,结果是:7,2,6
id  category  date
1   a         2013-01-01
2   b         2013-01-03
3   c         2013-01-02
4   a         2013-01-02
5   b         2013-01-02
6   c         2013-01-03
7   a         2013-01-03
8   b         2013-01-01
9   c         2013-01-01
Run Code Online (Sandbox Code Playgroud)
我可以在PostgreSQL中知道如何做到这一点吗?
在下面的表格,我怎么得到公正的最新记录的id=1基础上,登入列,而不是所有3条记录?
+----+---------------------+---------+
| id | signin              | signout |
+----+---------------------+---------+
|  1 | 2011-12-12 09:27:24 | NULL    |
|  1 | 2011-12-13 09:27:31 | NULL    |
|  1 | 2011-12-14 09:27:34 | NULL    |
|  2 | 2011-12-14 09:28:21 | NULL    |
+----+---------------------+---------+
Run Code Online (Sandbox Code Playgroud) sql ×7
postgresql ×4
mysql ×3
group-by ×2
t-sql ×2
distinct ×1
distinct-on ×1
duplicates ×1
oracle ×1
plpgsql ×1
rank ×1
return ×1
return-type ×1
select ×1
sql-order-by ×1
sql-server ×1
subquery ×1